Перенаправить стандартный вывод ошибок в Unix - PullRequest
0 голосов
/ 02 декабря 2011

Я создал папку, ABC. В этой папке я создал два файла, file1 и file2. Далее в папке я установил права доступа rw для всех. Когда я пытаюсь ls ABC, он печатает:

/bin/ls: cannot access ABC/file2: Permission denied

/bin/ls: cannot access ABC/file1: Permission denied

file1  file2

Я хочу разбить это сообщение на две части и записать в файлы success.txt и fail.txt. Так что в Bash я попробовал что-то вроде:

ls ABC > success.txt 2> fail.txt

Но в success.txt у меня есть "file1 file2", но fail.txt пуст, так где первые две строки сообщения?


Спасибо Арне и Шеллтеру за проявленный интерес. Поэтому я создаю папку с:

mkdir ABC

Далее:

 cd ABC
 touch file1 file2

Далее:

cd ..
chmod 666 ABC

И когда я ввожу ls ABC, я получаю:

/bin/ls: cannot access ABC/file2: Permission denied

/bin/ls: cannot access ABC/file1: Permission denied

file1  file2

Но когда я пишу сценарий sh вроде:

#!/bin/sh
$* > success.txt 2> fail txt

fail.txt пуст. Зачем? Я добавляю, что в другой ситуации все работает, поэтому проблема заключается только в том, что команда печатает информацию как на sterr, так и на stdout.

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

Я думаю, что ваша система настроена на ls для использования цветовых кодов, когда вывод осуществляется на терминал (через переменную среды, псевдоним или функцию). Если требуются цвета, ls будет lstat для каждого файла, для которого требуется разрешение на поиск в каталоге. Просто перечисление имен файлов не требует разрешения на поиск.

1 голос
/ 03 декабря 2011

Я полагаю, что вы ls определены как псевдоним или функция оболочки. У вас есть что-то вроде

alias ls='/bin/ls -l'

в одном из ваших файлов запуска (.bashrc, .bash_profile)?

Каков выход

type -a ls

ls ABC само по себе не должно выдавать эти сообщения об ошибках; директория 666 не помешает списку имен файлов. Попробуйте /bin/ls ABC, чтобы подтвердить это.

Ваш псевдоним или функция не видны из сценария оболочки.

Ваш синтаксис для направления stdout в один файл и stderr в другой правильный. Вы просто запускаете команду, которая ничего не записывает в stderr.

Между прочим, установка 666 разрешений для каталога редко имеет смысл.

...