Include il comando nel file di output?

17

Ci scusiamo per il titolo confuso!

Supponiamo che corra

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

Otterrò un file chiamato "kwin-depends" nella mia cartella Desktop.

C'è qualche trucco per includere il comando che ho emesso come parte del file, preferibilmente all'inizio del file?

Quindi, almeno in 14.04 LTS, le prime poche righe avrebbero questo aspetto:

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

Invece di fare così:

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>
    
posta DK Bose 22.10.2015 - 16:18

9 risposte

19

Vorrei solo usare una semplice funzione. Aggiungi questo al tuo file ~/.bashrc :

function runcom(){
    echo "[email protected]"
    ## Run the command
    [email protected]
}

Ora, ogni volta che vuoi eseguire un comando e stamparlo, puoi fare:

runcom apt-cache depends kde-window-manager > out

Quanto sopra produce questo file:

$ 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
    
risposta data terdon 23.10.2015 - 13:28
12

Puoi fare:

tee file.txt <<<'apt-cache depends kde-window-manager' | bash >>file.txt

Stessa cosa usando echo invece di Here stringhe ( <<< ):

echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
  • tee scriverà in STDOUT e anche nel file file.txt

  • Lo STDOUT di tee i.e. apt-cache depends kde-window-manager verrà inviato a bash per eseguire il comando e aggiungere lo STDOUT a file.txt .

Esempio:

$ 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>
    
risposta data heemayl 22.10.2015 - 20:28
11

Più minimalista - approccio n. 4 e n. 3, entrambi possono essere convertiti in funzione; # 2 il mio preferito - awk . # 1 utilizza il comando script - strumento molto versatile, utile per registrare la riga di comando in generale; applicabile ovunque, per qualsiasi cosa tu voglia registrare.

Metodo 1: Esiste un comando /usr/bin/script (che viene fornito con ubuntu di default) per registrare l'output della riga di comando, che cattura tutto, insieme al prompt e al comando. Per salvare un solo comando e il relativo output su un file specifico, utilizzare -c flag e specificare il file di output. Esempio

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秒

Approccio n. 2: hackery di awk

Awk ha la funzione system() che ti permette di eseguire comandi di shell da awk script o comando . L'output apparirà sullo schermo, comando prima, uscita successiva. Per reindirizzare ciò che vedi a un file usa > operator.

Questo può essere fatto in due modi: chiedere all'utente di inserire elementi da stdin o come argomento della riga di comando. Il primo è più facile da ottenere, quindi pubblicalo.

(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) Versione args della riga di comando; senza includere l'output per evitare di dare una risposta troppo lunga. Ancora una volta, aggiungi > a reindirizzare al file

awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString"  "ARGV[i]; print myString; system(myString)  }' apt-cache depends gnome-terminal

Metodo 3: chiedi a bash di fare il lavoro per te

[email protected]:~$ 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

Reindirizza al file con > operator:

bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt

Approccio n. 4: (il mio secondo preferito)

Ispirato al post di ByteCommander; possiamo usare read e quindi eseguire i comandi necessari in subshell

read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")

Esecuzione di esempio:

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

Approccio n. 5:

Utilizza echo o here string (alias <<< "string" ) per fornire argomenti a sh -c a 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

E se vuoi, puoi usare lo stesso trucco con 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 {}; {}"'
    
risposta data Sergiy Kolodyazhnyy 22.10.2015 - 16:59
6
  1. Inizia script -q outputfile
  2. Esegui il tuo comando
  3. Premere Ctrl - D
  4. Apri il file outputfile

Esempio

Inizia script

[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends

Inizia il tuo comando

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] % 

Premi Ctrl - D

Script done, file is /home/aboettger/Desktop/kwin-depends

Mostra il tuo comando e l'output

[aboettger:~/tmp] % cat ~/Desktop/kwin-depends

e vedrai qualcosa di simile

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
    
risposta data A.B. 23.10.2015 - 13:29
5

Se vuoi espandere l'alias (solo bash) puoi farlo in questo modo:

function runcmd
{
    local check_cmd=${BASH_ALIASES[]}

    if [ -z "$check_cmd" ]; then
        check_cmd=
    fi

    shift #skip 1st arg

    echo "$check_cmd [email protected]"
    $check_cmd [email protected]
}

Ora puoi eseguire

runcmd acd leafpad > out
    
risposta data GARCIN David 23.10.2015 - 17:16
4

Potrebbe esserci un modo più semplice, ma puoi farlo con uno script:

#!/bin/sh
echo 
apt-cache depends 

Crea un file script con questo contenuto nella tua cartella Home e concedi l'autorizzazione di esecuzione

chmod +x script

Esegui in questo modo:

./script kde-window-manager > ~/Desktop/kwin-depends
    
risposta data Pilot6 22.10.2015 - 16:35
4

Soluzione estremamente semplice che utilizza una funzione Bash a una riga

Preparazione:

Questo approccio utilizza una funzione bash personalizzata per fornire la funzionalità desiderata. Lo definisci eseguendo la seguente riga nella sessione del terminale. nota che puoi scegliere qualsiasi nome di variabile bash valido invece di runandlog :

runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "" | tail -n +2; )

Questo tuttavia persiste solo per la sessione Bash corrente, ovvero dopo aver chiuso la finestra del terminale, la funzione sarà scomparsa.
Se hai provato e ti è piaciuto, puoi renderlo sempre disponibile modificando il file ~/.bashrc e aggiungendo questa riga alla fine di esso.

Come usare:

Dopo aver definito la funzione, è possibile utilizzarla per eseguire comandi durante la registrazione sia del comando stesso sia del suo output in un file. Potresti anche aggiungere più informazioni come l'utente che l'ha eseguita, che ho già incluso nella funzione, o l'ora esatta in cui è stata eseguita. Le richieste di caratteristiche nei commenti sono benvenute! :)

La sintassi è semplice:

runandlog LOGFILENAME YOUR-COMMAND-WITH-ARGUMENTS

Esempio:

Una sessione di esempio come utente bytecommander , che opera dalla directory home potrebbe essere simile a questa:

bytecommander: ~ $  runandlog mylogfile fortune
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos

Quale risultato in un nuovo file mylogfile (se già esiste, la funzione aggiungerà l'output ad esso!) nella directory corrente con il contenuto:

[bytecommander] $ fortune 
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos
    
risposta data Byte Commander 22.10.2015 - 21:05
3

Un trucco abbastanza arcano ma funzionale sarebbe:

(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends

Brutto, ma funziona!

    
risposta data Arronical 22.10.2015 - 16:35
2

Potresti semplicemente passare il comando a una funzione che stamperà prima il comando e l'output del comando in seguito (i reindirizzamenti vengono tenuti fuori dal comando stampato intenzionalmente, puoi facilmente cambiarlo rimuovendo le virgolette dal comando e stampando ed eseguendo [email protected] invece di nella funzione):

function myfunction() {
    printf "%s\n\n" ""
    
}
$ myfunction "printf \"bar\n\"" > foo
$ cat foo
printf "bar\n"

bar

Per aggiungere successivamente il comando, puoi eseguire questo comando, che inserirà l'ultimo comando eseguito nella parte superiore di un file:

<<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\n/p') - >foo
  • <<<"[...]" : qui stringa; [...] viene reindirizzato a cat 's stdin ;
  • $(<foo) : sostituzione di comando; è sostituito con il contenuto di "foo";
  • cat [...] - >foo : concatena stdin a [...] e restituisce a "foo";
  • <([...]) : sostituzione del processo: viene sostituito con un descrittore di file contenente l'output di [...] ;
  • history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\n/p' : emette gli ultimi due comandi, rimuove due spazi seguiti da una o più cifre seguite da due spazi dalla prima riga e lo stampa;
$ printf "bar\n" >foo
$ <<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\n/p') - >foo
$ cat foo
printf "bar" >foo

bar
    
risposta data kos 22.10.2015 - 17:59

Leggi altre domande sui tag