La sortie d'une commande Bash est-elle stockée dans un registre? Par exemple, quelque chose de similaire à la $?
capture de la sortie au lieu de l'état de sortie.
Je pourrais affecter la sortie à une variable avec:
output=$(command)
mais c'est plus typant ...
Réponses:
Vous pouvez utiliser
$(!!)
pour recalculer (pas réutiliser) la sortie de la dernière commande.Le
!!
exécute seul la dernière commande.la source
$(your_cmd)
en utilisant des backticks:`your_cmd`
selon le manuel de Gnu Bash, ils sont fonctionnellement identiques. Bien sûr, cela est également soumis à l'avertissement émis par @memecsgit diff $(!!)
où la commande précédente était unefind
invocation.$()
place des backticks. Mais probablement rien pour perdre le sommeil. github.com/koalaman/shellcheck/wiki/SC2006$()
.La réponse est non. Bash n'alloue aucune sortie à aucun paramètre ni à aucun bloc de sa mémoire. De plus, vous n'êtes autorisé à accéder à Bash que par ses opérations d'interface autorisées. Les données privées de Bash ne sont accessibles que si vous les piratez.
la source
Une façon de faire est d'utiliser
trap DEBUG
:Les stdout et stderr de la commande la plus récemment exécutée seront désormais disponibles dans
/tmp/out.log
Le seul inconvénient est qu'il exécutera une commande deux fois: une fois pour rediriger la sortie et l'erreur vers
/tmp/out.log
et une fois normalement. Il existe probablement également un moyen d'empêcher ce comportement.la source
rm -rf * && cd ..
, non seulement le répertoire courant, mais aussi le répertoire parent sera effacé ?? cette approche me semble très dangereusetrap '' DEBUG
Si vous êtes sur mac et que cela ne vous dérange pas de stocker votre sortie dans le presse-papiers au lieu d'écrire dans une variable, vous pouvez utiliser pbcopy et pbpaste comme solution de contournement.
Par exemple, au lieu de faire cela pour rechercher un fichier et comparer son contenu avec un autre fichier:
Vous pouvez faire ceci:
La chaîne se
/var/bar/app/one.php
trouve dans le presse-papiers lorsque vous exécutez la première commande.À propos, pb in
pbcopy
etpbpaste
représente le presse-papiers, synonyme de presse-papiers.la source
$ find app -name 'one.php' | xclip $ diff $(xclip -o) /var/bar/two.php
pbpaste
avec la substitution de commandes.Inspiré par la réponse d'anubhava, qui je pense n'est pas réellement acceptable car il exécute chaque commande deux fois.
De cette façon, la sortie de la dernière commande est dans / tmp / last et la commande n'est pas appelée deux fois.
la source
grep
ougit diff
+1 de toute façonComme l'a dit konsolebox, vous devrez pirater lui-même. Voici un très bon exemple de la manière dont on pourrait y parvenir. Le référentiel stderred (en fait destiné à la coloration de stdout) donne des instructions sur la façon de le construire.
Je l'ai essayé: définition d'un nouveau descripteur de fichier à l'intérieur
.bashrc
comme(nombre est arbitraire) et modifier en
stderred.c
conséquence afin que le contenu est aussi écrit à fd 41. Ce genre de travaillé, mais contient des charges de NUL octets, formatages étranges et sont essentiellement des données binaires, pas lisibles. Peut-être que quelqu'un avec une bonne compréhension de C pourrait essayer cela.Si tel est le cas, tout ce dont vous avez besoin pour obtenir la dernière ligne imprimée est
tail -n 1 [logfile]
.la source
Ouais, pourquoi taper des lignes supplémentaires à chaque fois d'accord. Vous pouvez rediriger le retour vers l'entrée, mais la sortie vers l'entrée (1> & 0) est non. Vous ne voudrez pas non plus écrire une fonction encore et encore dans chaque fichier pour la même chose.
Si vous n'exportez les fichiers nulle part et que vous avez l'intention de les utiliser uniquement localement, vous pouvez demander à Terminal de configurer la déclaration de fonction. Vous devez ajouter la fonction dans un
~/.bashrc
fichier ou dans un~/.profile
fichier. Dans le second cas, vous devez activer àRun command as login shell
partir deEdit>Preferences>yourProfile>Command
.Créez une fonction simple, dites:
Dans le script principal:
Bash enregistre la variable même en dehors de la portée précédente:
la source
Solution très simple
Celui que j'utilise depuis des années.
Script (ajouter à votre
.bashrc
ou.bash_profile
)Usage
J'ai tendance à ajouter
| cap
à la fin de toutes mes commandes. De cette façon, lorsque je trouve que je veux faire du traitement de texte sur la sortie d'une commande à exécution lente, je peux toujours la récupérer avecres
.la source
cat -
danscap () { cat - | tee /tmp/capture.out}
ici?cap () { tee /tmp/capture.out }
Y a- t-il un hoquet qui me manque?cat - | cat - | cat -
avance juste pour le rendre plus intéressant? 😉 Je vais le réparer une fois que j'ai testé pour m'assurer que c'est vraiment un tympanVous ne savez pas exactement pourquoi vous en avez besoin, cette réponse peut donc ne pas être pertinente. Vous pouvez toujours enregistrer la sortie d'une commande:,
netstat >> output.txt
mais je ne pense pas que ce soit ce que vous recherchez.Il existe bien sûr des options de programmation cependant; vous pouvez simplement obtenir un programme pour lire le fichier texte ci-dessus après l'exécution de cette commande et l'associer à une variable, et dans Ruby, mon langage de choix, vous pouvez créer une variable à partir de la sortie de la commande en utilisant des `` backticks '':
Collez ceci dans un fichier .rb et exécutez-le:
ruby file.rb
et cela créera une variable hors de la commande et vous permettra de la manipuler.la source
J'ai une idée que je n'ai pas le temps d'essayer de mettre en œuvre immédiatement.
Mais que faire si vous faites quelque chose comme ce qui suit:
Il peut y avoir des problèmes avec la mise en mémoire tampon d'E / S. Le fichier peut également devenir trop volumineux. Il faudrait trouver une solution à ces problèmes.
la source
Je pense que l'utilisation de la commande de script pourrait aider. Quelque chose comme,
script -c bash -qf fifo_pid
Utilisation des fonctionnalités bash à définir après l'analyse.
la source
Si vous ne voulez pas recalculer la commande précédente, vous pouvez créer une macro qui scanne le tampon actuel du terminal, essaie de deviner la sortie -supposée- de la dernière commande, la copie dans le presse-papiers et la tape finalement dans le terminal.
Il peut être utilisé pour des commandes simples qui retournent une seule ligne de sortie (testé sur Ubuntu 18.04 avec
gnome-terminal
).Installer les outils suivants:
xdootool
,xclip
,ruby
Dans
gnome-terminal
allez àPreferences -> Shortcuts -> Select all
et réglez-le surCtrl+shift+a
.Créez le script ruby suivant:
Dans les paramètres du clavier, ajoutez le raccourci clavier suivant:
bash -c '/bin/sleep 0.3 ; xdotool key ctrl+shift+a ; xdotool key ctrl+shift+c ; ( (xclip -out | ${HOME}/parse.rb ) > /tmp/clipboard ) ; (cat /tmp/clipboard | xclip -sel clip ) ; xdotool key ctrl+shift+v '
Le raccourci ci-dessus:
la source