escrevendo uma transcrição de comando para o arquivo

1

Aqui está um script da questão Mercurial 2743 . Chame de mq.sh . Estou tentando fazer o seguinte, no Debian squeeze.

  1. Comandos de eco + saída padrão + erro padrão para um arquivo.

  2. Prefixo com o diretório de trabalho. Furar em $ PWD não funciona como presumivelmente continua usando o valor de quando foi o primeiro | originado.

  3. Redefinir o redirecionamento de volta ao normal saída padrão / erro no final. Eu não sei como fazer isso, mas eu imagine que eu teria que usar exec novamente.

  4. Estou chamando isso com sh mq.sh . Eu gostaria de fazer tudo de forma portável (se possível), e parece que o exec é específico do bash, então estou intrigado porque isso está funcionando. Também set -x xtrace é provavelmente festança específico também. Eu peguei do Manual de referência de bash. Não chama com sh executar tudo através de dash no Debian?

1 atualmente funciona, eu acho. Como faço 2 e 3? E eu posso ter um esclarecimento sobre 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
    
por Faheem Mitha 07.05.2011 / 00:12

2 respostas

3

exec para descritores de arquivos e set -x são portáveis; xtrace não é, mas na verdade deve ser a mesma coisa que -x .

Para salvar e restaurar descritores de arquivos, você realmente usa exec novamente. Você precisa escolher alguns descritores não utilizados, o que geralmente significa qualquer coisa acima de 2, e redirecionar os originais para aqueles, então redirecionar de volta no final.

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>&-

A última linha primeiro dup() s os descritores de arquivos salvos de onde eles vieram, então fecha ( &- ) as cópias. Os fechamentos provavelmente são desnecessários, mas é uma boa ideia.

Observe também que, se isso está sendo executado em seu próprio shell, os redirecionamentos desaparecem quando o shell é executado. Você só precisaria desfazer o redirecionamento se estivesse usando . (portátil) ou source ( bash ).

    
por 07.05.2011 / 00:22
1

Para o diretório de trabalho, tente PS4='+$PWD ' . As aspas simples significam que só é expandido quando está prestes a ser impresso. O primeiro caractere de PS4 pode ser impresso várias vezes, então você provavelmente ainda deseja o + ou pelo menos um espaço no início.

De acordo com a definição POSIX do conjunto , set -x e set -o xtrace são suportados . A página do manual do traço também diz que está tudo bem.

    
por 07.05.2011 / 01:00