GNU/Linux >> Znalost Linux >  >> Linux

Bash Echo Příkazový řádek spuštěn na samotném příkazovém řádku (ne ve skriptu)?

Pro účely dokumentace mám na mysli přesměrování na soubor stdout a stderr z příkazu, který provádím.
Například bych spustil (můj příkaz je méně triviální než alias ll ale to je asi jedno):

$ ll > out-err.dat 2>&1
$ cat out-err.dat
drwxr-xr-x 39 us00001 us00001    4096 jul 31 14:57 ./
drwxr-xr-x  3 root    root       4096 feb  2 06:06 ../
-rw-------  1 us00001 us00001   62226 jul 31 11:56 .bash_history
...

Také pro účely dokumentace chci uložit do stejného výstupního souboru jako příkazový řádek, který jsem použil.
Zamýšlené chování a výstup je

$ [NEW COMMAND LINE]?
$ cat out-err.dat
[NEW COMMAND LINE]   <- This first line would contain the command line used
drwxr-xr-x 39 us00001 us00001    4096 jul 31 14:57 ./
drwxr-xr-x  3 root    root       4096 feb  2 06:06 ../
-rw-------  1 us00001 us00001   62226 jul 31 11:56 .bash_history
...

Jak to lze provést?
Vím, že bych mohl napsat bash skript a spustit ho, takže příkaz by zůstal zdokumentován samostatně.
Dále bych mohl napsat skript, který by opakoval příkazový řádek do souboru a pak jej provedl s přesměrováním na stejný soubor.
Hledám možné řešení bez skriptů.

UPRAVIT :
Zpětná vazba na hezkou odpověď.
To by se nevešlo jako komentář.

Testoval jsem pomocí příkazu echo_command ll echo_command.sh ../dir> out-err.dat 2>&1 .

Skriptujte echo_command.sh , který zdrojuji , obsahuje definice funkcí.

../dir je neexistující adresář, aby se vynutil nějaký výstup do stderr .

Metoda 1 :
Funguje dobře, až na dva problémy:

  • Nerozumí aliasům (ll v tomto případě; při nahrazení ls fungovalo to).

  • Nezaznamenává část přesměrování.

Metoda 2 :
Tak dobře to nefunguje. Nyní se vytiskne také část přesměrování, ale příkazový řádek se vytiskne na obrazovku namísto přesměrování do souboru.

UPRAVIT :
Zpětná vazba na zveřejněný komentář o skriptu nástroj.
Je poměrně všestranný, ještě více s scriptreplay .

script lze volat samostatně, což vytváří interaktivní shell (nezachoval by nedávnou historii nadřazeného shellu)

Může být také volán jako script -c . Tento poslední formulář odpovídá cíli OP, ale neukládá samotný příkaz do souboru protokolu. Produkuje (alespoň v základních případech) stejný výstup jako > 2>&1 .

Zdá se tedy, že to zde není užitečné.

Přijatá odpověď:

Můžete použít funkci jako je tato:

echo_command() { printf '%sn' "${*}"; "${@}"; }

Příklad:

$ echo_command echo foo bar baz
echo foo bar baz
foo bar baz
$ echo_command uname
uname
Linux

Jak řekl Tim Kennedy, existuje také velmi užitečný script příkaz:

$ script session.log
Script started, file is session.log
$ echo foo
foo
$ echo bar
bar
$ echo baz
baz
$ exit
exit
Script done, file is session.log
$ cat session.log
Script started on 2018-07-31 16:30:31-0500
$ echo foo
foo
$ echo bar
bar
$ echo baz
baz
$ exit
exit

Script done on 2018-07-31 16:30:43-0500

Aktualizovat

Pokud také potřebujete protokolovat přesměrování a v podstatě každou syntaxi shellu (všimněte si, že jsem přidal malý Příkazový řádek: zpráva pro snadnou identifikaci prováděného příkazu):

echo_command() {
  local arg
  for arg; do
    printf 'Command line: %sn' "${arg}"
    eval "${arg}"
  done
}

Jen vezměte v úvahu, že byste měli být velmi opatrní s uvozováním jako eval se používá:

$ echo_command 'echo foo > "file 2"; cat "file 2"'
Command line: echo foo > "file 2"; cat "file 2"
foo

Přijímá také mnoho příkazů najednou namísto jediného:

$ echo_command 'echo foo' 'echo bar' 'echo baz'
Command line: echo foo
foo
Command line: echo bar
bar
Command line: echo baz
baz

Linux
  1. vim:příkaz nenalezen

  2. nohup:příkaz nenalezen

  3. Jaké je použití $# v Bash

  1. Bash tipy pro každý den na příkazovém řádku

  2. Příkaz „eval“ v Bash?

  3. Spusťte příkaz bash na jenkins pipeline

  1. Předat argumenty příkazového řádku skriptu Bash?

  2. Jak vidět, že se přesný příkazový řádek spouští uvnitř některé instance Bash?

  3. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?