Повторение тильды в файле без его расширения в Bash

Мне нужно написать аргумент в файл в сценарии Bash, поэтому я делаю что-то вроде этого,

echo "Argument is: $1" >> file

Проблема в том, что если в аргументе есть тильда (~), я не хочу, чтобы он расширялся до домашнего каталога. Таким образом, если пользователь передал ~/bin в качестве аргумента скрипту, он будет записан как ~/bin, а не как /home/user/bin. Как мне это сделать?


person gsingh2011    schedule 03.09.2012    source источник
comment
Пользователь должен передать аргумент в кавычках ("") или экранировать \~.   -  person Prince John Wesley    schedule 03.09.2012
comment
@PrinceJohnWesley Я не хочу делать это требованием пользователя.   -  person gsingh2011    schedule 03.09.2012
comment
Я не уверен, что вы сможете обойти эту проблему (внешняя оболочка всегда будет расширяться, если только пользователь не процитирует аргумент). Я думаю, что подсказка для пользовательского ввода - ваша единственная надежда. Недавно я столкнулся с этой самой проблемой, так что вы не одиноки в этой особенности.   -  person Jonah Bishop    schedule 03.09.2012
comment
Если пользователь вводит your-script ~/foo, то ~ расширяется оболочкой пользователя. your-script просто не может узнать, что пользователь набрал тильду; все, что он видит в качестве аргумента, это "/home/theuser/foo". Любой пользователь bash должен знать об этом поведении. Поскольку ~ означает домашний каталог пользователя, почему бы вам не расширить его?   -  person Keith Thompson    schedule 03.09.2012


Ответы (3)


Я предполагаю, что ваша программа запускается как:

$ your_prog ~/foo

Аргумент переводится еще до того, как ваша программа будет запущена, поэтому вы ничего не можете сделать, чтобы предотвратить это, кроме как научить пользователя правильно цитировать, если расширение нежелательно:

$ your_prog "~/foo"
person Charles Duffy    schedule 03.09.2012

Вы можете использовать команду read для принятия пользовательского ввода.

read var
echo "$var"
person kev    schedule 03.09.2012

Чарльз Даффи имеет правильный ответ. Ваша программа ведет себя именно так, как ожидалось. Попробуйте это:

$ echo The HOME directory is ~
$ echo "The HOME directory is ~"

Вы увидите, что простое помещение тильды в кавычки предотвращает расширение.

Причина, по которой вы не видите тильду, несмотря на ваши кавычки, заключается в том, что оболочка расширяет тильду еще до того, как ваша программа получит ее в качестве аргумента.

Оболочка в Unix сама по себе является очень мощным созданием. Он обрабатывает расширение переменных и специальных символов, таких как ~ и *, поэтому вашей программе это не нужно.

Как сказал мне однажды старый профессор: «Это очень хорошо, за исключением случаев, когда это не так». В данном конкретном случае "это не так". Оболочка Unix мешает вам увидеть то, что вы хотите.

Единственный способ обойти это — избавиться от оболочки. Вы можете сделать это, используя оператор read.

person David W.    schedule 03.09.2012