2015-08-28 1 views
1

Я попытался запустить панель запуска Android Studio (studio.sh), чтобы использовать установленную вручную Java (а не общесистемную Java по умолчанию). Поскольку я уже объявлял PATH и JAVA_HOME в моем файле .bashrc, я просто получил этот файл в сценарии оболочки:Почему тильда в пути не расширена в сценарии оболочки?

. /home/foobar/.bashrc

но по какой-то причине $ JAVA_HOME/bin/java по-прежнему не был признан исполняемым файлом скриптом.

Я добавил несколько журналов и выяснил, что JAVA_HOME был расширен как ~/install/java ..., то есть оператор тильды не был расширен в домашний каталог.

Я искал, но не смог найти причину, по которой он не был расширен. Является ли тильда специфичной для Bash функцией (сценарий использует #!/Bin/sh, а Linux Mint использует тире, а не bash)? Не помогает ли тильда в некоторых обстоятельствах?

Я заменил ~ на $ HOME в своем объявлении .bashrc, а затем он работал, поэтому HOME известен во время выполнения.

ответ

6

В bash manual, обратите внимание, что расширение распорки во время подстановки параметров, но не рекурсивно:

Порядка разложений: подстановка скобок; расширение тильды, расширение параметров и переменных, арифметическое расширение и подстановка команд (выполняется слева направо); расщепление слов; и расширение имени файла.

Это означает, что любая тильда (или ссылки параметров или замену команды), которые хранятся нераскрытыми в переменной баш будет автоматически не решить. Ваша переменная JAVA_HOME содержит лительную тильду, поэтому bash не будет автоматически расширять ее.

Вполне вероятно, что ваши исправления работали, потому что тильды не применяются в кавычках:

$ echo "~" 
~ 
$ echo ~ 
/home/jeffbowman 

... но расширение параметра как $HOME имеет место в кавычках. Замена его с помощью $ HOME расширяется до вашего домашнего каталога во время назначения JAVA_HOME.

FOO=~/bar  # stores /home/jeffbowman/bar 
FOO="~/bar"  # stores ~/bar 
FOO=$HOME/bar # stores /home/jeffbowman/bar 
FOO="$HOME/bar" # stores /home/jeffbowman/bar 

Хотя лучший вариант, чтобы обеспечить ваше назначение является правильным, если вы хотите, чтобы развернуть его вручную, эти SO вопросы есть хорошие варианты:

+0

[Этот ответ] (http://stackoverflow.com/a/29310477/258523) может быть лучше, но на самом деле я не смотрел на тот, который вы слишком тщательно связали. –

+0

@EtanReisner Спасибо. Есть несколько давних вопросов о расширении моей хранимой тильды, которые могут потребовать обнуления. Этот подходит; Я отредактирую его. (Я бы скорее связался с вопросом, чем с ответом, потому что широта ответов полезна для понимания преимуществ и недостатков каждого.) –

+0

Да, у меня было несколько вкладок такого типа какое-то время ждут меня, чтобы решить, как хорошо их обмануть.Я почти опубликовал мета-вопрос о том, можно ли заставить модератора перенести некоторые из лучших ответов на новый канонически заданный вопрос или что-то еще. –