Modifica l'output di ogni comando


1

Vorrei sapere se esiste un modo per alterare l'output di ogni comando che eseguo nel terminale. Lo scopo è quello di rendere l'output formulato per il mio markdown howto's.

Per esempio

ls -la .*z
#>-rw-r--r--  1 hologos  staff   3580 26 zář 14:22 .zconfig
#>-rw-------  1 hologos  staff  28927 17 říj 15:59 .zhistory
#>-rw-r--r--  1 hologos  staff   5600 30 zář 08:03 .zshrc

"#>" È quello che voglio che ogni riga di output inizi con questo. Uso principalmente zsh.

Grazie.

Risposte:


2

Farei qualcosa del genere

  command | sed -e 's/^/line-prefix /'

esempio

$ ls -la m* | sed -e 's/^/#> /'
#> -rwxr-xr-x 1 root root 76080 Aug 11  2011 mailstats
#> -r-xr-xr-x 1 root root 92824 Aug 11  2011 makemap
#> -rwxr-xr-- 1 root root 12389 Jul 22  2011 makewhatis
#> -rwxr-xr-x 1 root root 11520 Mar  6  2011 matchpathcon
#> -rwxr-xr-x 1 root root 56600 May 18  2011 mcelog
#> lrwxrwxrwx 1 root root    15 Mar 18  2011 mkdict -> cracklib-format
#> -rwxr-xr-x 1 root root  9600 Jul 22  2011 mklost+found
#> -rwxr-xr-x 1 root root 10176 Jan  6  2007 mksock
#> -rwxr-xr-x 1 root root  4409 Jan  7  2007 modeline2fb
#> -rwxr-xr-x 1 root root 23787 Jul 22  2011 mountstats
#> -rwxr-xr-x 1 root root 58032 Jan  7  2007 mtr

Puoi anche applicarlo a una shell in modo che sia fatto automaticamente

$ ksh | sed -e 's/^/#> /'
$ ls m*
#> mailstats
#> makemap
#> makewhatis
#> matchpathcon
#> mcelog
#> mkdict
#> mklost+found
#> mksock
#> modeline2fb
#> mountstats
#> mtr

Probabilmente ci sono alcuni inconvenienti / aspetti, prenditi cura di questo.


Un approccio diverso è quello di eseguire script(vedi man script) e quindi utilizzare il tuo editor preferito (o un piccolo script perl / awk / etc) per renderlo compatibile con il markdown - In vim farei semplicemente qualcosa come :%s/^/#> /riparare tutte le righe in una volta sola . Quindi inserisco le intestazioni di markdown ecc.


Questo è esattamente ciò di cui ho bisogno. Sto pensando di usarlo mentre eseguo tutti i tipi di comandi. Ci sono degli svantaggi / gotcha a cui puoi pensare?
Hologos,

@Hologos: alcuni comandi si comportano diversamente se STDOUT viene reindirizzato a un processo anziché connesso a un TTY. Inoltre c'è qualche stranezza con il prompt della shell che non sembra causare alcun danno ma che è sconcertante. Probabilmente c'è di più.
RedGrittyBrick,

1
IFS=$'\n';for line in `ls -la .*z`;do echo "#>$line";done

passerà attraverso l'output del comando ( ls -la .*z) e visualizzerà il risultato sullo schermo anteponendo #>ogni riga

ps:

la IFSparte serve per impostare il delimitatore su una nuova riga anziché su uno spazio bianco


Grazie, c'è un modo in cui non dovrei scrivere questo? Qualcosa di simile, cd() { builtin cd "$@" && ll; }ma per ogni comando o qualche tipo di alias che altererebbe ogni comando in background?
Hologos,

perché dovresti evitare di usare il forloop?

O qualcosa del genere, ls -la .z*ma lo espanderebbe automaticamente come ls -la .z* | my-program, che conterrebbe il tuo codice.
Hologos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.