Как остановить перенаправление в ударе

Быстрая-и-грязная острота Bash для переименования всех (globbed) файлов в текущем каталоге от filename.txt кому: filename.txt-20120620:

for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done

Инициативный компьютерный фанат Bash найдет, что некоторый пограничный случай повреждает его, я уверен.:)

Очевидно, это не делает желательных вещей как проверка, имеет ли файл уже что-то, что похоже на дату в конце.

8
29.06.2013, 01:35
3 ответа

Можно звонить exec снова восстановить исходные дескрипторы. Необходимо будет сохранить их где-нибудь.

exec 3>&1 4>&2 1>script.log 2>&1
… logged portion …
exec 1>&3 2>&4
echo >&2 "Done"

В зарегистрированной части можно использовать исходные дескрипторы для одной команды путем перенаправления к дополнительным дескрипторам.

echo "30 seconds remaining" >&3

С другой стороны, можно поместить зарегистрированную часть сценария в составной команде и перенаправлении та составная команда. Это не работает, если Вы хотите использовать исходные дескрипторы в прерывании где-нибудь в той перенаправленной части.

{
… logged portion …
} >script.log 2>&1
echo >&2 "Done"
12
27.01.2020, 20:09
  • 1
    Комментарий о повторении к >&3 делает это мое предпочтительное решение. Спасибо (снова)! –  Willem 03.07.2013, 23:16

Используйте additinal fd 3 и 4 для stdout и stderr и просто перенаправьте 1 и 2 им в конце Вашего сценария:

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"
6
27.01.2020, 20:09
  • 1
    Это возвращает ошибку: exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied –  Willem 28.06.2013, 12:24
  • 2
    Эта ошибка может произойти, когда Вы пытаетесь запустить свой сценарий в другом пользователе. Вы используете свой сценарий через sudo? –  rush 28.06.2013, 12:51
  • 3
    Да, вот именно: Я сделал su в другую учетную запись и выполнил код. Скрипт, который я пишу, будет запущен через sudo, таким образом, я столкнусь с той же проблемой там. Существует ли альтернатива? –  Willem 28.06.2013, 13:52
  • 4
    , которому я верю, существует некоторое изящное решение, к сожалению, я знаю единственную опцию, которая может быть абсолютно недопустимой с точки зрения безопасности: добавьте своего целевого пользователя к Вашей основной группе исходного пользователя и добавьте полномочия записи группы для/proc/self/fd/1 перед запуском сценария. (или еще более уязвимый - просто делают временное разрешение записи для всех и удаляют его прямо после того, как сценарий будет закончен без изменений группы). –  rush 28.06.2013, 18:12
  • 5
    @Willem, Это легко фиксируется при помощи дескрипторов файлов вместо того, чтобы вновь открыть файлы, видят мое редактирование. –  Gilles 'SO- stop being evil' 29.06.2013, 03:20

Сначала необходимо проверить, есть ли у Вас tty вообще.

if tty -s; then
    echo "Hello, World" > $(tty)
fi
1
27.01.2020, 20:09
  • 1
    Обратите внимание на то, что этот путь не может подать вывод к внешней программе. –  rush 28.06.2013, 11:29
  • 2
    Не необходимо использовать внешнее tty утилита. Можно перенаправить к специальному устройству /dev/tty. –  Paused until further notice. 28.06.2013, 16:04

Теги

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