запись файла команды в файл

Вот сценарий из Mercurial issue 2743 . Назовите это mq.sh Я пытаюсь заставить его сделать следующее: при сжатии Debian.

  1. Эхо-команды + стандартный вывод + стандартная ошибка для файла.

  2. Почему mail-utils / cron отправляет так много писем?
  3. Bash scripting - цикл до тех пор, пока значение возврата не будет 0
  4. stderr не перенаправляется на stdout
  5. Изменена ли переменная среды $ SHELL только для интерактивных оболочек?
  6. как makefile может определить, доступна ли команда на локальном компьютере?
  7. Использование getline с NR в awk
  8. Префикс с рабочим каталогом. Вложение в $ PWD не работает, поскольку оно, по-видимому, просто продолжает использовать значение с момента его первого
    источники.

  9. Сбросить перенаправление до нормального стандартного выхода / ошибки в конце. Я не уверен, как это сделать, но я предполагаю, что мне придется снова использовать exec .

  10. Я называю это с помощью sh mq.sh Я хотел бы сделать все переносимо (если возможно), и кажется, что exec является bash-специфичным, поэтому я озадачен, почему это работает. Также set -x xtrace , вероятно, также специфичен для bash. Я получил его из справочника Bash. Не звонит ли с sh запустить все через dash на Debian?

В настоящее время работает 1, я думаю. Как мне сделать 2 и 3? И могу ли я дать разъяснение по 4?

 export PS4="$PWD$ " exec > mq.log 2>&1 export HG="hg-crew" rm -r main clone set -o xtrace $HG init main cd main $HG init --mq $HG qnew foo echo a > a $HG add $HG qref $HG ci --mq -Am. cd .. $HG qclone main clone cd clone $HG paths --mq mv .hg/patches/.hg/hgrc{,.foo} $HG paths --mq $HG push --mq echo b >> a $HG qref $HG ci --mq -m. mv .hg/patches/.hg/hgrc.foo .hg/patches/.hg/hgrc $HG push --mq 

  • bash: перенаправление ввода-вывода, но не с суффиксами
  • Безопасная доля в самбе не работает, почему?
  • временный файл не найден в sh-скрипте
  • поиск содержимого файлов, упакованных в zip-файл
  • Как захватить вывод из команды в сценарии оболочки
  • Как печатать номера строк с соответствующей строкой, соответствующей шаблону с помощью команды оболочки?
  • 2 Solutions collect form web for “запись файла команды в файл”

    exec для дескрипторов файлов и set -x переносимы; xtrace нет, но на самом деле это то же самое, что и -x .

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

     exec 20<&0 21>&1 22>&2 # do your redirections # do whatever you wanted to have redirected exec <&20 >&21 2>&22 20<&- 21>&- 22>&- 

    Последняя строка сначала dup() s сохраненные дескрипторы файла назад, откуда они пришли, затем закрывает ( &- ) копии. Закрытия, вероятно, не нужны, но хорошая идея.

    Также обратите внимание, что если это выполняется в своей собственной оболочке, перенаправления уходят, когда оболочка делает. Вам нужно будет только отменить перенаправление, если вы используете . (переносной) или source ( bash ).

    Для рабочего каталога попробуйте PS4='+$PWD ' . Одиночные кавычки означают, что он только расширяется, когда он вот-вот будет напечатан. Первый символ PS4 может быть напечатан несколько раз, поэтому вам, вероятно, по-прежнему требуется + или, по крайней мере, место в начале.

    В соответствии с определением POSIX набора устанавливаются set -x и set -o xtrace . На странице тире говорит, что все в порядке.

    Linux и Unix - лучшая ОС в мире.