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

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

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

  2. Префикс с рабочим каталогом. Вложение в $ PWD не работает, поскольку оно, по-видимому, просто продолжает использовать значение с момента его первого
    источники.

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

  4. Я называю это с помощью 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 

  • Как установить работу cron для системы
  • Возможно ли иметь привязки клавиш vim в терминале?
  • scp, globbing и различные оболочки
  • Как разбирать сотни html файлов исходного кода в оболочке?
  • сбой команды ожидания
  • mv: Нет такой ошибки в файле или каталоге, хотя каталог, безусловно, существует
  • Не удается SSH после переключения на маршрутизатор Netgear
  • Rsync два типа файлов в одной команде?
  • 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 - лучшая ОС в мире.