Dans Bash, vous pouvez rediriger toutes les futures sorties stdout du script en cours d'exécution . Par exemple, avec ce script,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Cela se terminera dans 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
Mais cela est spécifique à Bash et l'exécutif nu avec redirection ne semble pas fonctionner dans Dash.
Syntax error: redirection unexpected
Comment puis-je le faire fonctionner dans Dash, ou éventuellement dans les deux shells?
>
dans le tiret. Je me rends compte que vous semblez demander autre chose mais je ne peux pas vraiment dire ce que c'est.Réponses:
Vous pouvez simplement faire:
Vous pouvez le faire avec n'importe quel shell.
Si vous n'aimez pas son apparence, faites peut-être que le script s'enroule dans une fonction.
la source
run ${1+"$@"} || do stuff
pour que les arguments soient conservés.${1+"$@"}
ne fait rien"$@"
. Il a eu d'autres problèmes de toute façon."$@"
passera""
lorsqu'il n'y a pas d'arguments tandis que${1+"$@"}
passera une chaîne vide lorsqu'il n'y a pas d'arguments. Cela est extrêmement important pour de nombreux programmes, car ils analysent""
comme un argument vide tandis qu'une chaîne vide (sans guillemets) ne serait pas du tout interprétée comme un argument.dash
sur un tel système) , mais sinon, il"$@"
est unique en ce sens qu'un cas zéro-args ne se substitue pas à un argument nul pour les shells POSIX."${@+is especially cool $@}"
. Mais pas très différent de l'ancienne${1+”$@"}
solution de contournement après tout. Si vous avez un ksh93:"${1+quoted" not quoted "quoted again}"
La substitution de processus est facilement simulée avec des canaux nommés.
En fait, les canaux nommés sont l'un des mécanismes (l'autre étant
/dev/fd
) avec lesquels la substitution de processus peut être implémentéebash
.la source
Je ne pense pas que ce soit possible en
dash
. Pour autant que je sache sur saman
page , il ne prend pas en charge la substitution de processus.Comme solution de contournement, vous pouvez essayer ce que mikserv a suggéré , ou vous pouvez tout rediriger vers un fichier, puis une fois votre script terminé (probablement dans un script), ajoutez le contenu de ce fichier à l'enregistreur:
la source
dash
autres shells. La substitution de processus équivaut simplement à un argument qui pointe vers un/dev/fd/[num]
lien vers un canal anonyme.dash
fait ici des documents avec des canaux anonymes plutôt que de créer des fichiers temporaires comme le font la plupart des autres shells. Cecat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
n'est donc pas seulement équivalent sur le plan fonctionnel, vous pouvez même nommer le fd vous-même. Pourtant, votre point de vue est bien fait sur l'inverse - vous devez ouvrir un nouveau fd avecexec
et en arrière-plan un processus qui le lit.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
"plus facile" quecat <(get output)
?< >
redirections du shell. En gros, si vous n'en faites que deux, vous pouvez également les empiler sur les lignes suivantes. Mais oui, vous avez raison - j'aime ici les documents. Pourtant, autant de choses qui pourraient nécessiter de se souvenir, c'est plus facile quand elles fonctionnent universellement je pense. Là encore, beaucoup de gens n'ont pas beaucoup d'utilité pour les autres obus et cela ne fait donc aucune différence pour eux. Je ne suis tout simplement pas parmi eux./dev/fd/3
(sous cette forme précise), et les détails de ce qui arrive aux espaces blancs. . . et d'ailleurs, le fait que toute cette approche fonctionne du tout dans Dash, quand elle ne fonctionne pas dans d'autres shells qui ont tous les composants, signifie que l'approche globale est une règle spéciale à retenir. (Cela me rappelle les tentatives de créer un anglais simplifié avec moins de vocabulaire; ils coupent des mots comme persister , mais ils ignorent les idiomes tout aussi difficiles comme continuer .)