No Bash, você pode redirecionar todas as saídas stdout futuras do script em execução no momento . Por exemplo, com este script,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Isso terminará no syslog:
Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3
Mas isso é específico do Bash e o executivo nu com redirecionamento não parece funcionar no Dash.
Syntax error: redirection unexpected
Como posso fazê-lo funcionar no Dash, ou possivelmente nos dois reservatórios?
>
no traço. Sei que você parece estar pedindo outra coisa, mas não sei dizer o que é.Respostas:
Você pode apenas fazer:
Você pode fazer isso com qualquer shell.
Se você não gosta da aparência, talvez faça o script se envolver em uma função.
fonte
run ${1+"$@"} || do stuff
para que os argumentos sejam mantidos.${1+"$@"}
não faz nada"$@"
não. Teve outros problemas de qualquer maneira."$@"
passará""
quando não houver argumentos, enquanto${1+"$@"}
passará uma string vazia quando não houver argumentos. Isso é extremamente importante para muitos programas, pois eles analisam""
como um argumento vazio, enquanto uma string vazia (sem aspas) não seria interpretada como um argumento.dash
em um sistema assim) , mas por outro lado"$@"
é único, pois um caso de zero-args não substitui um argumento nulo para shells POSIX."${@+is especially cool $@}"
,. Mas não é praticamente muito diferente do que a${1+”$@"}
solução alternativa antiga, afinal. Se você tiver um ksh93:"${1+quoted" not quoted "quoted again}"
A substituição do processo é facilmente simulada com pipes nomeados.
De fato, pipes nomeados são um dos mecanismos (sendo o outro
/dev/fd
) com os quais a substituição de processo pode ser implementadabash
.fonte
Eu não acho que isso seja possível
dash
. Tanto quanto posso ver na suaman
página , ele não tem suporte para substituição de processos.Como solução alternativa, você pode tentar o que o mikserv sugeriu ou pode redirecionar tudo para um arquivo e, depois que seu script terminar (presumivelmente, isso está em um script), adicione o conteúdo desse arquivo ao logger:
fonte
dash
outros shells. A substituição de processo equivale apenas a um argumento que aponta para um/dev/fd/[num]
link para um canal anônimo.dash
documenta aqui com pipes anônimos, em vez de gerar arquivos temporários, como a maioria dos outros shells. Portanto,cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
não é apenas funcionalmente equivalente, você também pode nomear o fd. Ainda assim, seu argumento é bem fundamentado: é preciso abrir um novo arquivo comexec
um processo que o leia.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
"mais fácil" do quecat <(get output)
?< >
redirecionamentos de shell. basicamente, se você fizer apenas dois deles, também poderá empilhar nas linhas a seguir. Mas sim, você tem razão - eu gosto dos documentos aqui. Ainda assim, quantas coisas forem necessárias para lembrar, é mais fácil quando elas funcionam universalmente, eu acho. Então, novamente, muitas pessoas não têm muito uso para outras conchas e, portanto, não faz diferença para elas. Eu apenas não estou entre eles./dev/fd/3
(nessa forma precisa), e os detalhes do que acontece com o espaço em branco. . . e, por falar nisso, o fato de toda essa abordagem funcionar no Dash, quando não funciona em outros shells que possuem todos os componentes, significa que a abordagem geral é uma regra especial a ser lembrada. (Isso me lembra de tentativas de criar uma Inglês simplificado com menos vocabulário; eles cortaram palavras como persistem , mas eles ignoram just-como-difícil expressões como Keep On .)