Désolé pour le titre déroutant!
Supposons que je cours
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
J'obtiendrai un fichier nommé "kwin-depend" dans mon dossier Desktop.
Existe-t-il une astuce pour inclure la commande que j'ai émise dans le fichier, de préférence au début du fichier?
Donc, au moins en 14.04 LTS, les premières lignes ressembleraient à ceci:
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Au lieu de juste comme ça:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
command-line
bash
DK Bose
la source
la source
Réponses:
J'utiliserais simplement une fonction simple. Ajoutez ceci à votre
~/.bashrc
fichier:Maintenant, chaque fois que vous souhaitez exécuter une commande et l'imprimer, vous pouvez faire:
Ce qui précède produit ce fichier:
la source
apt-cache depends
pouracd
, je reçois « Aucune commande « DAA » trouvé, avez - vous dire: ... » quand je lanceruncom acd leafpad > out
.ls
est aliaséls --color=auto'
dans la réalité. Qu'est - ce que vous pourriez faire (tant qu'il n'y a pas de guillemets simples ou doubles guillemets dans votre pseudonyme), est la suivante:$ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ")
.MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Tu peux faire:
Même chose en utilisant
echo
au lieu de Here strings (<<<
):tee
écrira dans STDOUT et aussi dans le fichierfile.txt
Le STDOUT de
tee
ieapt-cache depends kde-window-manager
sera alimentébash
pour exécuter la commande et ajouter le STDOUT àfile.txt
.Exemple:
la source
tee
mais le mien continuait à échouer. Bon travail! +1tee
semble bien :)Le plus minimaliste - approche # 4 et # 3, les deux pourraient être convertis en fonction; # 2 mon préféré -
awk
. # 1 utilise lascript
commande - outil très polyvalent, utile pour enregistrer la ligne de commande en général; applicable partout, pour tout ce que vous voulez enregistrer.Approche n ° 1: il existe une
/usr/bin/script
commande (fournie avec ubuntu par défaut) pour enregistrer la sortie de ligne de commande, qui capture tout, ainsi que l'invite et la commande. Pour simplement enregistrer une commande et sa sortie dans un fichier spécifique, utilisez l'-c
indicateur et spécifiez le fichier de sortie. ExempleApproche n ° 2: piratage awk
Awk a une
system()
fonction qui vous permet d'exécuter des commandes shell à partir d'unawk
script ou d'une commande . La sortie apparaîtra sur l'écran, la commande d'abord, la sortie ensuite. Pour rediriger ce que vous voyez vers un>
opérateur d' utilisation de fichier .Cela peut être fait de deux manières - demandez à l'utilisateur de saisir des éléments depuis stdin ou comme argument de ligne de commande. Le premier est plus facile à réaliser, d'où son affichage.
(1)
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
(2) Version args de la ligne de commande; n'inclut pas la sortie pour éviter de répondre trop longtemps. Encore une fois, ajoutez
>
pour rediriger vers le fichierApproche n ° 3: demandez à bash de faire le travail pour vous
Rediriger vers un fichier avec l'
>
opérateur:bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Approche n ° 4: (mon deuxième favori)
Inspiré par le post de ByteCommander; nous pouvons utiliser
read
puis exécuter les commandes nécessaires en sous-shellExemple d'exécution:
Approche n ° 5:
Utilisez
echo
ouhere string
(aka<<< "string"
) pour fournir des arguments àsh -c
traversxargs
Et si vous le souhaitez, vous pouvez utiliser cette même astuce avec un alias:
la source
awk
vraiment un petit gars très configurable n'est-ce pas! `Le script semble également utile pour quelques autres utilisations.script -q outputfile
outputfile
Exemple
Début
script
Lancez votre commande
Presse Ctrl-D
Montrez votre commande et sortie
et vous verrez quelque chose comme ça
la source
Si vous souhaitez une extension d'alias (bash uniquement), vous pouvez le faire de cette façon:
Vous pouvez maintenant exécuter
la source
Il peut y avoir un moyen plus simple, mais vous pouvez le faire par un script:
Créez un fichier
script
avec ce contenu dans votre dossier d'accueil et donnez la permission d'exécutionExécutez-le de cette façon:
la source
script.sh
crée toujours un fichier appeléscript.log
avec sa sortie.Solution extrêmement simple utilisant une fonction Bash d'une ligne
Préparation:
Cette approche utilise une fonction bash personnalisée pour fournir la fonctionnalité souhaitée. Vous le définissez en exécutant la ligne suivante dans votre session de terminal. notez que vous pouvez choisir n'importe quel nom de variable bash valide au lieu de
runandlog
:Cependant, cela ne persiste que pour la session Bash en cours, ce qui signifie qu'après la fermeture de la fenêtre du terminal, la fonction aura disparu.
Si vous l'avez essayé et aimé, vous pouvez le rendre toujours disponible en modifiant votre
~/.bashrc
fichier et en ajoutant cette ligne à la fin de celui-ci.Comment utiliser:
Après avoir défini la fonction, vous pouvez l'utiliser pour exécuter des commandes tout en enregistrant la commande elle-même et sa sortie dans un fichier. Vous pouvez même ajouter plus d'informations comme l'utilisateur qui l'a exécutée, que j'ai déjà inclus dans la fonction, ou l'heure exacte à laquelle elle a été exécutée. Les demandes de fonctionnalités dans les commentaires sont les bienvenues! :)
La syntaxe est simple:
Exemple:
Un exemple de session en tant qu'utilisateur
bytecommander
, fonctionnant à partir du répertoire personnel pourrait ressembler à ceci:Ce qui entraînera un nouveau fichier
mylogfile
(s'il existe déjà, la fonction y ajoutera la sortie!) Dans le répertoire courant avec le contenu:la source
Une astuce assez onclever mais fonctionnelle serait:
Laid, mais ça marche!
la source
Vous pouvez simplement passer la commande à une fonction qui imprimera la commande en premier et la sortie de la commande ensuite (les redirections sont conservées intentionnellement hors de la commande imprimée, vous pouvez facilement changer cela en supprimant les guillemets de la commande et en imprimant et en exécutant à la
$@
place de$1
dans la fonction):Pour ajouter la commande par la suite, vous pouvez exécuter cette commande, qui insérera la dernière commande exécutée en haut d'un fichier:
<<<"[...]"
: ici chaîne;[...]
est redirigé verscat
l »stdin
;$(<foo)
: substitution de commande; il est remplacé par le contenu de "foo";cat [...] - >foo
: Concatènestdin
à[...]
et sorties « foo »;<([...])
: substitution de processus: il est remplacé par un descripteur de fichier contenant la sortie de[...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: affiche les deux dernières commandes, supprime deux espaces suivis d'un ou plusieurs chiffres suivis de deux espaces de la première ligne et l'imprime;la source
$1
? Et ce n'est pas nécessaireeval
.eval
n'est pas nécessaire, je ne sais pas pourquoi je l'ai ajouté avant. Merci.