web-dev-qa-db-fra.com

Inclure la commande dans le fichier de sortie?

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>
17
DK Bose

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
19
terdon

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>
12
heemayl

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 {}; {}"'
11
  1. Démarrer script -q outputfile
  2. Exécuter votre commande
  3. Presse Ctrl-D
  4. Ouvrez le fichier 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>
6
A.B.

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
5
GARCIN David

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 scriptavec 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
4
Pilot6

Solution extrêmement simple utilisant une fonction Bash sur 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 un nom de variable bash valide au lieu de runandlogname__:

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.

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 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

Exemple:

Un exemple de session en tant qu'utilisateur bytecommandername__, 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
4
Byte Commander

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!

3
Arronical

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
2
kos