Замена команды не работает, когда это - вход для 'читения'

Если я запускаю следующий скрипт замены команды:

var=$(ls)
echo $var

это работает как ожидалось - вывод является результатами ls команда. Но если я присваиваю переменное чтение использования:

read var
echo $var

в котором $ (ls) является входом к read, вывод является литералом

$(ls)

вместо вывода ls команда.

Я не понимаю, почему существует такое различие, потому что я думаю содержание переменной var должно быть то же в обоих случаях, и поэтому оболочка должна рассматривать echo команда в обоих точно тот же путь.

Вы могли дать объяснение?

1
задан 24 September 2018 в 09:03

2 ответа

Замена команды является расширением оболочки, и 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 в оболочке для более короткой версии.

3
ответ дан 3 December 2019 в 07:23

var=$(ls) выполняет команду ls и присваивает вывод переменной Во втором случае, это просто присваивает строку, которую Вы ввели в переменную, нет никакого случая выполнения. Это - просто строка, присвоенная переменной, удар ничего не делает с ним.

0
ответ дан 3 December 2019 в 07:23

Другие вопросы по тегам:

Похожие вопросы: