Если я запускаю следующий скрипт замены команды:
var=$(ls)
echo $var
это работает как ожидалось - вывод является результатами ls
команда. Но если я присваиваю переменное чтение использования:
read var
echo $var
в котором $ (ls) является входом к read
, вывод является литералом
$(ls)
вместо вывода ls
команда.
Я не понимаю, почему существует такое различие, потому что я думаю содержание переменной var
должно быть то же в обоих случаях, и поэтому оболочка должна рассматривать echo
команда в обоих точно тот же путь.
Вы могли дать объяснение?
Замена команды является расширением оболочки, и Bash не выполняет расширения на входе к read
.
Это - хорошая вещь, потому что read
как предполагается, получает безотносительно ерунды (или блеск) наивное (или эксперт), пользователь ввел.
Попытайтесь ввести любой вход, который обычно разворачивала бы оболочка, и Вы найдете, что то же самое происходит...
$ var=~ # ~ was expanded before assignment
$ echo $var
/home/zanna
$ read -r var
~
$ echo $var
~
Существуют своего рода исключения к этому - read
символы обратной косой черты обработок как Escape
Символ обратной косой черты ‘\’ может использоваться для удаления любого особого значения для следующего символьного чтения и для продолжения строки.
Это почти никогда не, что Вы на самом деле хотите (Вы хотите read
для получения безотносительно, пользователь ввел включая любые обратные косые черты), таким образом, необходимо обычно использовать -r
флаг с read
(как я сделал в своих примерах):
- r
Если эта опция дана, обратная косая черта не действует как символ ESC. Обратная косая черта считается частью строки. В частности, пара новой строки обратной косой черты не может использоваться в качестве продолжения строки.
Другое исключение - то, что вход разделяется на поля, в некотором роде подобные разделению слова, таким образом, можно присвоить нескольким переменным:
$ read -r var
one two three
$ echo $var
one two three
$ read -r baa ram ewe
one two three
$ echo $ram
two
Кавычки от этого раздела руководства Bash - прокручивают вниз для нахождения read
, или выполненный help read
в оболочке для более короткой версии.
var=$(ls)
выполняет команду ls и присваивает вывод переменной Во втором случае, это просто присваивает строку, которую Вы ввели в переменную, нет никакого случая выполнения. Это - просто строка, присвоенная переменной, удар ничего не делает с ним.