Désolé pour le titre déroutant!
Supposons que je cours
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
Je vais obtenir 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?
Ainsi, au moins dans 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 simplement comme ceci:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Je voudrais juste utiliser une fonction simple. Ajoutez ceci à votre fichier ~/.bashrc
:
function runcom(){
echo "$@"
## Run the command
$@
}
Maintenant, chaque fois que vous voulez exécuter une commande et l’imprimer, vous pouvez faire:
runcom apt-cache depends kde-window-manager > out
Ce qui précède produit ce fichier:
$ cat out
apt-cache depends kde-window-manager
kde-window-manager
Depends: Perl
Depends: kde-runtime
Depends: kde-style-oxygen
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
libegl1-mesa
Depends: libgcc1
|Depends: libgl1-mesa-glx
Depends: <libgl1>
libgl1-mesa-swx11
libgl1-mesa-glx
|Depends: libgles2-mesa
Depends: <libgles2>
libgles2-mesa
Depends: libice6
Depends: libkactivities6
Depends: libkcmutils4
Depends: libkdeclarative5
Depends: libkdecorations4abi2
Depends: libkdecore5
Depends: libkdeui5
Depends: libkio5
Depends: libknewstuff3-4
Depends: libkwineffects1abi5
Depends: libkwinglesutils1
Depends: libkwinglutils1abi2
Depends: libkworkspace4abi2
Depends: libplasma3
Depends: libqt4-dbus
Depends: libqt4-declarative
Depends: libqt4-script
Depends: libqtcore4
Depends: libqtgui4
Depends: libsm6
Depends: libstdc++6
Depends: libwayland-client0
|Depends: libwayland-egl1-mesa
Depends: <libwayland-egl1>
libwayland-egl1-mesa
Depends: libx11-6
Depends: libx11-xcb1
Depends: libxcb-composite0
Depends: libxcb-damage0
Depends: libxcb-image0
Depends: libxcb-keysyms1
Depends: libxcb-randr0
Depends: libxcb-render0
Depends: libxcb-shape0
Depends: libxcb-shm0
Depends: libxcb-sync1
Depends: libxcb-xfixes0
Depends: libxcb-xtest0
Depends: libxcb1
Depends: libxcursor1
Depends: libxext6
Depends: libxrandr2
Depends: libxxf86vm1
Breaks: kde-style-bespin
Breaks: kde-style-bespin:i386
Breaks: <kde-style-skulpture>
Breaks: <kde-style-skulpture:i386>
Breaks: kde-workspace-data
Breaks: <kde-workspace-data:i386>
Breaks: kdeartwork-theme-window
Breaks: kdeartwork-theme-window:i386
Breaks: <kdebase-workspace-data>
Breaks: <kdebase-workspace-data:i386>
Breaks: kwin-style-crystal
Breaks: kwin-style-crystal:i386
Breaks: kwin-style-dekorator
Breaks: kwin-style-dekorator:i386
Breaks: kwin-style-qtcurve
Breaks: kwin-style-qtcurve:i386
Replaces: kde-workspace-data
Replaces: <kde-workspace-data:i386>
Replaces: <kdebase-workspace-data>
Replaces: <kdebase-workspace-data:i386>
Conflicts: kde-window-manager:i386
Tu peux faire:
tee file.txt <<<'apt-cache depends kde-window-manager' | bash >>file.txt
Même chose en utilisant echo
au lieu des chaînes Here (<<<
):
echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
tee
écrit dans STDOUT ainsi que dans le fichier file.txt
Le STDOUT de tee
c'est-à-dire apt-cache depends kde-window-manager
sera transmis à bash
pour exécuter la commande et ajouter le STDOUT à file.txt
.
Exemple:
$ echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
$ cat file.txt
apt-cache depends kde-window-manager
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Le plus minimaliste - approche n ° 4 et n ° 3, les deux pourraient être convertis en fonction; # 2 mon préféré - awk
. # 1 utilise la commande script
- outil très polyvalent, utile pour l’enregistrement de la ligne de commande en général; applicable n'importe où, pour tout ce que vous voulez enregistrer.
Approche n ° 1: Il existe une commande /usr/bin/script
(fournie avec ubuntu par défaut) pour enregistrer la sortie en ligne de commande, qui capture tout, ainsi que l'invite et la commande. Pour ne sauvegarder qu'une commande et sa sortie dans un fichier spécifique, utilisez l'indicateur -c
et spécifiez le fichier de sortie. Exemple
xieerqi:$ script -c 'apt-cache depends gnome-terminal' outputFile.txt
Script started, file is outputFile.txt
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
(extra output omitted)
Script done, file is outputFile.txt
xieerqi:$ cat outputFile.txt
Script started on 2015年10月22日 星期四 08时58分46秒
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
(extra output omitted)
Script done on 2015年10月22日 星期四 08时58分46秒
Approche n ° 2: le piratage de awk
Awk a la fonction system()
qui vous permet d’exécuter des commandes Shell à partir du script ou de la commande awk
. La sortie apparaîtra à l'écran, commande d'abord, sortie suivante. Pour rediriger ce que vous voyez vers un fichier, utilisez l'opérateur >
.
Cela peut être fait de deux manières: demandez à l’utilisateur de saisir des éléments à partir de stdin ou en tant qu’argument de ligne de commande. Le premier est plus facile à réaliser, et donc le poster.
(1) awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
Enter command to run:
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
(extra output omitted)
(2) version des arguments en ligne de commande; ne pas inclure la sortie pour éviter de donner une réponse trop longue. Encore une fois, ajoutez >
pour rediriger vers le fichier
awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString" "ARGV[i]; print myString; system(myString) }' apt-cache depends gnome-terminal
Approche n ° 3: demandez à bash de faire le travail pour vous
xieerqi@eagle:~$ bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND '
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
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 dans le sous-shell
read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")
Échantillon échantillon:
xieerqi:$ read command && (printf "COMMAND READ: %s" "$command";printf "\n+++++++\nOUTPUT\n"; sh -c "$command")
printf "This was a triumph; I'm making a note here - huge success"
COMMAND READ: printf "This was a triumph; I'm making a note here - huge success"
+++++++
OUTPUT
This was a triumph; I'm making a note here - huge success
Approche # 5:
Utilisez echo
ou here string
(alias <<< "string"
) pour fournir des arguments à sh -c
à xargs
xieerqi:$ echo "apt-cache policy gnome-terminal" | xargs -I {} bash -c 'echo {}; {}'
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main AMD64 Packages
100 /var/lib/dpkg/status
Et si vous le souhaitez, vous pouvez utiliser cette même astuce avec un alias:
xieerqi:$ printAndRun <<< "apt-cache policy gnome-terminal"
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main AMD64 Packages
100 /var/lib/dpkg/status
xieerqi:$ type printAndRun
printAndRun is an alias for 'xargs -I {} bash -c "echo {}; {}"'
script -q outputfile
outputfile
Exemple
Démarrer script
[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends
Commencez votre commande
[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] %
Presse Ctrl-D
Script done, file is /home/aboettger/Desktop/kwin-depends
Montre ta commande et ton résultat
[aboettger:~/tmp] % cat ~/Desktop/kwin-depends
et vous verrez quelque chose comme ça
[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
Si vous voulez développer un alias (bash seulement), vous pouvez le faire de cette façon:
function runcmd
{
local check_cmd=${BASH_ALIASES[$1]}
if [ -z "$check_cmd" ]; then
check_cmd=$1
fi
shift #skip 1st arg
echo "$check_cmd $@"
$check_cmd $@
}
Vous pouvez maintenant courir
runcmd acd leafpad > out
Il existe peut-être un moyen plus simple, mais vous pouvez le faire avec un script:
#!/bin/sh
echo $1
apt-cache depends $1
Créez un fichier script
avec ce contenu dans votre dossier Accueil et donnez le droit d'exécution.
chmod +x script
Exécutez-le de cette façon:
./script kde-window-manager > ~/Desktop/kwin-depends
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 un nom de variable bash valide au lieu de runandlog
name__:
runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "$1" | tail -n +2; )
Toutefois, 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 disparaîtra.
Si vous avez essayé et aimé cela, vous pouvez le rendre toujours disponible en modifiant votre fichier ~/.bashrc
et en ajoutant cette ligne à la fin.
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 d'autres informations, telles que l'utilisateur qui les a exécutées, que j'ai déjà incluses dans la fonction, ou l'heure exacte à laquelle elles ont été exécutées. Les demandes de fonctionnalités dans les commentaires sont les bienvenues! :)
La syntaxe est simple:
runandlog LOGFILENAME YOUR-COMMAND-WITH-ARGUMENTS
Un exemple de session en tant qu'utilisateur bytecommander
name__, opérant à partir du répertoire de base, pourrait ressembler à ceci:
bytecommander: ~ $ runandlog mylogfile fortune
A mathematician is a device for turning coffee into theorems.
-- P. Erdos
Ce qui donnera un nouveau fichier mylogfile
(s'il existe déjà, la fonction y ajoutera la sortie!) dans le répertoire courant avec le contenu:
[bytecommander] $ fortune
A mathematician is a device for turning coffee into theorems.
-- P. Erdos
Une astuce assez onéreuse mais fonctionnelle serait:
(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends
Moche, mais ça marche!
Vous pouvez simplement passer la commande à une fonction qui imprimera la commande en premier et ensuite la sortie de la commande (les redirections sont volontairement laissées en dehors de la commande imprimée, vous pouvez facilement changer cela en supprimant les guillemets de la commande et en imprimant et en exécutant $@
au lieu de $1
dans la fonction):
function myfunction() {
printf "%s\n\n" "$1"
$1
}
$ myfunction "printf \"bar\n\"" > foo
$ cat foo
printf "bar\n"
bar
Pour ajouter la commande ultérieurement, vous pouvez exécuter cette commande, qui insérera la dernière commande exécutée en haut du fichier:
<<<"$(<foo)" cat <(history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p') - >foo
<<<"[...]"
: here string; [...]
est redirigé vers cat
's stdin
;$(<foo)
: substitution de commande; il est remplacé par le contenu de "foo";cat [...] - >foo
: concatène le stdin
en [...]
et le sort en "foo";<([...])
: substitution de processus: il est remplacé par un descripteur de fichier contenant le résultat 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 de plusieurs chiffres suivis de deux espaces de la première ligne et les affiche;$ printf "bar\n" >foo
$ <<<"$(<foo)" cat <(history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p') - >foo
$ cat foo
printf "bar" >foo
bar