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
Zdá se tedy, že to zde není užitečné.
Můžete použít funkci jako je tato:
Příklad:
Jak řekl Tim Kennedy, existuje také velmi užitečný
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ý
Jen vezměte v úvahu, že byste měli být velmi opatrní s uvozováním jako
Přijímá také mnoho příkazů najednou namísto jediného:script -c
.Přijatá odpověď:
echo_command() { printf '%sn' "${*}"; "${@}"; }
$ echo_command echo foo bar baz
echo foo bar baz
foo bar baz
$ echo_command uname
uname
Linux
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
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
}
eval
se používá:$ echo_command 'echo foo > "file 2"; cat "file 2"'
Command line: echo foo > "file 2"; cat "file 2"
foo
$ echo_command 'echo foo' 'echo bar' 'echo baz'
Command line: echo foo
foo
Command line: echo bar
bar
Command line: echo baz
baz