$ 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="$*"
wc
сообщит вам, с каким файлом он работает, если это возможно. С первым с каналом он читает из стандартного ввода, а не из файла, поэтому не сообщает имя файла. Однако во втором случае вы используете подстановку процесса, которая представляет вывод команды в виде файла, о котором сообщает wc
. Он сообщает о файловом дескрипторе, который был дан для чтения.