Как читать из канала, сохраняя позиционные параметры?

ls $myvar1/*.txt 

Если бы имена путей были раскрыты перед переменными, это будет искать имена файлов, соответствующие *. Txt в каталоге с именем $ myvar1 , чего у вас, вероятно, не будет. После этого он расширит $ myvar1 до пути к вашему домашнему каталогу, оставив / home / username / *. Txt , что не то же самое, что сначала развернуть путь, а затем ищет в домашнем каталоге имена файлов, оканчивающиеся на .txt .

В общем, поскольку имена файлов могут содержать знаки $ , я думаю, что порядок раскрытия всегда будет иметь значение. Рассмотрим любой сценарий, использующий глобус типа * в каталоге, содержащем файл с именем $ PATH .

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

5
01.05.2017, 22:51
1 ответ

Посмотрите на эту технику с 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
3
27.01.2020, 20:41

Теги

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