Почему printf игнорирует IFS при распечатывании результата моего сценария?

Клиент потока наводнения может быть выполнен как демон, может управляться со своим собственным GUI или по HTTP. Это имеет хорошую функцию 'Execute command when torrent is finished', куда можно поместить простое sendmail или mail команда.

1
23.05.2017, 15:40
1 ответ
$ ls
a b c d
$ rm $(except b d)
$ ls
b d

Это не может работать, по крайней мере, не надежно, потому что "except" не может решить, как оболочка разделит (и далее расширится), ее вывод прежде, чем передать его rm команда.

Для ответа на вопрос printf не использует $IFS. Единственная команда, которая использует IFS, read. Кроме этого, $IFS используется оболочкой для разделения слова и присоединиться к позиционным параметрам в "$*".

Вы, вероятно, хотите:

 printf '%s ' $matches

Или

 printf '%s\n' $matches

Но снова, в

 rm $(except a b)

Оболочка, которая интерпретирует ту командную строку, разделит вывод except согласно его собственному $IFS (пространством по умолчанию, вкладкой или новой строкой, которая является почему использование пространства или \n выше не имеет никакого значения), и также развернет подстановочные знаки там.

Таким образом, если файлы кроме a и b "this file.txt" и **a**, except произведет "this file.txt **a** " и Вы закончите тем, что пытались удалить this, file.txt и a (так как **a** расширится до всех файлов с a на их имя).

Если Вы хотите присоединиться к соответствиям с пробелами без конечного пробела, Вы могли бы сделать:

IFS=
set -- $matches
IFS=' '
matches="$*"
3
27.01.2020, 23:29

Теги

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