Использование:
ls | xargs -t -i{} echo {} 2>&1 >/dev/null
2>&1
отправляет стандартную ошибку от xargs
туда, куда идет стандартный вывод; >/dev/null
отправляет исходный стандартный вывод на /dev/null
. Таким образом, в результате получается, что стандартный вывод содержит команды echo, а /dev/null
содержит имена файлов. Мы можем спорить о пробелах в именах файлов и о том, будет ли проще использовать скрипт sed
, чтобы поставить 'echo' в начале каждой строки (без опции -t
), или использовать ли вы:
ls | xargs -i{} echo echo {}
(Проверено: Solaris 10, Korn Shell; должен работать на других оболочках и платформах Unix.)
Если вы не возражаете увидеть внутреннюю работу команд, мне удалось отделить вывод ошибок от xargs
и вывод ошибок выполненной команды.
al * zzz | xargs -t 2>/tmp/xargs.stderr -i{} ksh -c "ls -dl {} 2>&1"
(нестандартная) команда al
перечисляет свои аргументы по одному в строке:
for arg in "$@"; do echo "$arg"; done
Первое перенаправление (2>/tmp/xargs.stderr
) отправляет вывод ошибки из xargs
в файл /tmp/xargs.stderr
. Выполнена команда 'ksh -c "ls -dl {} 2>&1"
', которая использует оболочку Korn для запуска ls -ld
для имени файла с любой ошибкой, выводимой на стандартный вывод.
Вывод в /tmp/xargs.stderr
выглядит следующим образом:
ksh -c ls -dl x1 2>&1
ksh -c ls -dl x2 2>&1
ksh -c ls -dl xxx 2>&1
ksh -c ls -dl zzz 2>&1
Я использовал ls -ld
вместо echo
, чтобы убедиться, что я тестировал ошибки - файлы x1
, x2
и xxx
существуют, но zzz
нет.
Вывод на стандартный вывод выглядел так:
-rw-r--r-- 1 jleffler rd 1020 May 9 13:05 x1
-rw-r--r-- 1 jleffler rd 1069 May 9 13:07 x2
-rw-r--r-- 1 jleffler rd 87 May 9 20:42 xxx
zzz: No such file or directory
При запуске без команды, заключенной в 'ksh -c "..."
', перенаправление ввода-вывода было передано команде в качестве аргумента ('ls -ld
'), и поэтому сообщалось, что не удалось найти файл '2>&1
». То есть xargs
сама не использовала оболочку для перенаправления ввода / вывода.
Можно было бы организовать различные другие перенаправления, но основная проблема заключается в том, что xargs
не предусматривает отделения своего собственного вывода ошибки от вывода команд, которые он выполняет, поэтому это трудно сделать.
Другой довольно очевидный вариант - использовать xargs
для написания сценария оболочки, а затем выполнить его оболочкой. Это вариант, который я показал раньше:
ls | xargs -i{} echo echo {} >/tmp/new.script
Затем вы можете увидеть команды с:
cat /tmp/new.script
Вы можете запустить команды для удаления ошибок с помощью:
sh /tmp/new.script 2>/dev/null
И, если вы не хотите видеть стандартный вывод команд, добавьте 1>&2
в конец команды.