2016-07-02 1 views
0

Итак, я начал писать сценарии bash, и я создаю скрипт, который будет автоматически загружаться из исходного кода (так что он просто компилирует tarballs для вас). Мне нужно, чтобы он менял каталоги, чтобы перейти в архив. Тем не менее, всякий раз, когда я использую эту командуКак использовать команду чтения Bash для захвата пути к файлу, содержащего «~» (tilde)

read path 
cd $path 

Я всегда получаю ошибку tar-installer.sh: line 13: cd: ~: No such file or directory Для тех, кто нуждается его, вот полный скрипт ...

#!/bin/bash 
# This program auto-installs tarballs for you. 
# I designed this for Linux noobies who don't 
# know how to install tarballs. Or, it's for 
# people like me who are just lazy, and don't 
# want to put in the commands ourselves. 

echo "Tar Installer v1.1" 
echo "Gnu GPL v2.1" 
echo -n "Path to tarball:" 
read path 
cd $path 
echo -n "Please enter the file you wish to complile..." 
read file 
if $file =="*.tar.gz" 
then 
    tar -xzf $file 
    else 
     $file =="*.tgz" 
then 
    tar -xzf $file 
else 
    $file =="*.tar.bz2" 
then 
    tar -xjf $file 

Заключительная часть с тарболлами работа еще в ходе выполнения. Но каталог, который я использовал для cd path, был ~/Downloads/

Это, вероятно, легкое исправление, но я не знаю, как это исправить.

+1

Проблема, как представляется, связанных с чтения встроенной функции при приеме путей файлов с «~ /» в этом. –

+2

используйте http://shellcheck.net и исправьте все ошибки, обнаруженные там перед отправкой кода (вы должны сделать это сейчас). Спасибо и удачи .. – shellter

ответ

3

Вам необходимо заменить тильду ~ по домашнему пути. Это расширение не выполняется, если оно не выполняется напрямую.

cd "${path/#~/$HOME}" 

заменит ~ с домашним каталогом с помощью Баша Заменит ${value/search_term/replacement}.

Вы также можете комбинировать эхо & чтения:

read -p "Path to tarball: " pathname 

Также будьте осторожны при именовании переменных, как путь (PATH является переменной среды)

+1

Как насчет PATH '~ other_user'? –

+0

Если ваш макет каталога является стандартным стандартом Linux, добавление второй замены для замены любого оставшегося ведущего '' ''/home/'будет выглядеть как очевидный подход. – tripleee

-2

Потому что «компакт-диск» построен в функции Баш. Таким образом, вы должны попытаться запустить скрипт так:

#source tar-installer.sh 

Аналогичный вопрос здесь:

[1]: https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script

+0

Нет, это не проблема. – anishsane

+0

Почему? Я не понимаю. Я пытался запустить именно скрипт tar-installer.sh в Ubuntu 14:04 В первый раз у меня была ошибка с «cd», но тогда с «источником» не было ошибок. Поэтому я думаю, что #source tar-installer.sh решит проблему. –

+0

Проблема здесь в расширении тильды. Если '~' уже является частью переменной, он не будет расширяться. Ссылка вопроса, которую вы дали, решает совершенно другую проблему. Когда вы _execute_ сценарий, а не 'source'ing, порождается подоболочка. 'cd' изменяет рабочий каталог в этой оболочке; рабочий каталог в родителе остается неизменным. Такое поведение не имеет никакого отношения к заданному здесь вопросу. – anishsane

Смежные вопросы