ls $myvar1/*.txt
Если бы имена путей были раскрыты перед переменными, это будет искать имена файлов, соответствующие *. Txt
в каталоге с именем $ myvar1
, чего у вас, вероятно, не будет. После этого он расширит $ myvar1
до пути к вашему домашнему каталогу, оставив / home / username / *. Txt
, что не то же самое, что сначала развернуть путь, а затем ищет в домашнем каталоге имена файлов, оканчивающиеся на .txt
.
В общем, поскольку имена файлов могут содержать знаки $
, я думаю, что порядок раскрытия всегда будет иметь значение. Рассмотрим любой сценарий, использующий глобус типа *
в каталоге, содержащем файл с именем $ PATH
.
Напротив, переменные, содержащие символы глобуса, легче обойти, поскольку вы управляете значениями своих переменных.
Посмотрите на эту технику с bash 4.4:
function myf {
if ! [ -t 0 ];then
declare -a args=\($(</dev/stdin)\);
set -- "${args[@]}";
fi;
for i in "$@";do
echo "$i";
echo -----;
done
}
Тестирование:
$ function myf { if ! [ -t 0 ];then declare -a args=\($(</dev/stdin)\);set -- "${args[@]}"; fi;for i in "$@";do echo "$i";echo -----;done }
$ myf 1 "2 3" 4
1
-----
2 3
-----
4
-----
$ echo $'1 "2 3" 4'|myf
1
-----
2 3
-----
4
-----
Тот же результат можно получить и с:
$ echo 1 \"2 3\" 4 |myf
$ echo 1 "'2 3'" 4 |myf
Но echo 1 "2 3" 4
не будет работать, потому что bash игнорирует двойные кавычки в этом синтаксисе:
$ echo 1 "2 3" 4
1 2 3 4