在命令行上记录 Unix 命令

在命令行上记录 Unix 命令

为了教程的目的,我想将最后一个命令和最后一个命令的输出附加到文本文件中。

例如:ls在我主目录中执行完操作后,我在屏幕上看到

bguiz@sheen:~$ ls
Desktop     Music    Documents

我希望能够输入一个命令,将以下内容附加到名为的文本文件中cmd.txt

$ ls
Desktop     Music    Documents

这个想法是,每次我输入一个命令时,我都可以将命令本身及其输出记录到同一个文件中,并且在输入几个命令之后,它将演示一系列特定的命令。我知道这可以手动完成 - 但如果有一种简单的替代方法,为什么要这样做呢?对吧?

这是我目前所做的事情:

echo -n "\$ " >> cmd.txt; echo !-1:p >> cmd.txt; !-1 >> cmd.txt

它可以工作,但是相当笨重,并且存在一些缺陷,例如不能保留精确的屏幕格式。

是否有更优雅的解决方案?


感谢您迄今为止的回答,但我有一个要求,它需要与管道一起工作,例如:

ls -lart | grep ^d

需要将其附加到文件中:

$ ls -lart | grep ^d
drwx------ 14 bguiz staff   4096 2010-03-03 15:52 .cache
drwx------  5 bguiz staff   4096 2010-03-03 09:38 .ssh

答案1

[script.ksh] 使用“script.ksh ls”运行

#!/bin/ksh

OUTPUT="cmd.txt"

if [[ $# -eq 0 ]];then
  print "no command to run"
  exit
fi

# dump command being run to file
echo $@ >> $OUTPUT

# run command and output stdout to the screen and file
$@ | tee -a $OUTPUT

答案2

比你一直尝试的聪明方法更简单:

$ script cmd.txt

在这里做你想记录的事情

然后按 Control-d。

如果需要,您可以稍后编辑该文件以添加注释,也可以使用

$ script -a cmd.txt

将更多文本附加到现有文件。

可用的选项在实施过程中似乎存在很大差异。

  • Mac OS X(即 BSD)脚本支持-k将键盘输入记录到命令中
  • GNU 版本(在 Linux 系统上)支持-c允许您在原始命令行上指定命令,从而允许您跳过“在这里输入你的演示然后按 control-d”少量
  • BSD 版本可以在命令行上指定命令但不接受标志,而是必须遵循输出文件名(在这种情况下是必需的)。

最后,GNU 版本警告vi在类型脚本中没有很好地表示(并且我认为这个警告同样适用于所有其他使用 curses 的命令)。

答案3

编写如下脚本,script.sh以注释的形式插入注解:

#!/bin/sh -v

# Annotating the behaviour of the ls command
ls -l

# Other comments on the next command
cmd

注意-v第一行的开关:

-v verbose       The shell writes its input to standard error as it is read.

然后使用以下命令执行脚本,将 stdout 和 stderr 重定向到文件cmd.txt

$ ./script.sh > cmd.txt 2>&1

该文件cmd.txt将包含注释、命令及其相关输出,例如:

# Annotating the behaviour of the ls command
ls -l
total 1824
drwxr-xr-x 11 mrucci mrucci    4096 2010-02-14 18:16 apps
drwxr-xr-x  2 mrucci mrucci    4096 2010-02-20 12:54 bin
-rw-------  1 mrucci mrucci  117469 2010-02-25 11:02 todo.txt

# Other comments on the next command
cmd
./testscript.sh: 7: cmd: not foun

PS:请记住授予脚本执行权限:

$ chmod +x script.sh

答案4

在这种情况下,我一般会采用以下两种方法之一:

sh -x script

或者简单地运行命令,然后使用复制粘贴将材料保存到文件中。

'sh -x' 输出不包括正常的 PS1 提示符 - 它使用默认为 '+ ' 的 PS3,IIRC。并且它会稍微修改输出 - 细节会根据您使用的 shell 而略有不同(因此 'bash' 比 'ksh' 或 Bourne shell 更混乱)。我很少需要比复制粘贴所能管理的更多的材料,因此这是我对 StackOverflow 和 SuperUser 等的主要操作方式。

相关内容