Você poderia usar uma função como esta:
echo_command() { printf '%s\n' "${*}"; "${@}"; }
Exemplo:
$ echo_command echo foo bar baz
echo foo bar baz
foo bar baz
$ echo_command uname
uname
Linux
Como Tim Kennedy disse, há também um comando script
muito útil:
$ 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
Atualizar
Se você também precisar registrar os redirecionamentos e basicamente todas as sintaxes do shell (note que adicionei uma pequena mensagem Command line:
para identificar facilmente o comando sendo executado):
echo_command() {
local arg
for arg; do
printf 'Command line: %s\n' "${arg}"
eval "${arg}"
done
}
Lembre-se de que você deve tomar muito cuidado com as citações, pois eval
é usado:
$ echo_command 'echo foo > "file 2"; cat "file 2"'
Command line: echo foo > "file 2"; cat "file 2"
foo
Ele também aceita vários comandos de uma só vez, em vez de apenas um:
$ echo_command 'echo foo' 'echo bar' 'echo baz'
Command line: echo foo
foo
Command line: echo bar
bar
Command line: echo baz
baz