Return last command executed in shell-script

bashshell-script

In a bash-script I'd like to retrieve the last command which was executed. In bash itself the following command works like a charm.

lastCommand=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')

Inside scripts however history doesn't work at all.

Is there a way to retrieve the command inside a script?

Best Answer

For bash v4+ :

Use interactive mode in shell.

Set she-bang as

#!/bin/bash -i

and history inside of your script will work.

 $ cat test.sh
#!/bin/bash
history | wc -l
 $ ./test.sh
0
 $ sed -i '1s/bash/bash -i/' test.sh
 $ ./test.sh
6495

Commands was executed inside of script are not recorded into history.

For bash v3 (and possible for older ones)

  • The way above doesn't work for this vesions of bash. However you can remove she-bang at all and history will work well. This way also works great for bash v4.

  • set she-bang as interactive and do not forget about set -o history like chepner mentioned.

#!/bin/bash -i
set -o history

PS. history |tail -n2 |head -n1 doesn't equal to the last command. it is command before last one.

Note if last or prelast commands were multiline it won't return the correct result.

btw in console you can use !-2 to refer to prelast command instead of your strange construction. unfortunately it seems doesn't work in shell script even in interactive mode.

Related Question