Дополнительный вывод при перенаправлении ввода

$ 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="$*"
6
27.04.2016, 18:25
1 ответ

wc сообщит вам, с каким файлом он работает, если это возможно. С первым с каналом он читает из стандартного ввода, а не из файла, поэтому не сообщает имя файла. Однако во втором случае вы используете подстановку процесса, которая представляет вывод команды в виде файла, о котором сообщает wc . Он сообщает о файловом дескрипторе, который был дан для чтения.

14
27.01.2020, 20:22

Теги

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