Bash脚本用于捕获输入,运行命令和打印到文件

时间:2011-11-22 21:41:25

标签: linux bash io

我正在尝试做家庭作业,这非常令人困惑。我不确定教授的例子是用Perl还是bash,因为它没有标题。基本上,我只需要帮助解决问题:捕获输入并输出它。这是作业:

  1. 在会话中,提供包含工作目录的命令提示符,例如, $./logger/home/it244/it244/hw8$

  2. 接受用户的命令,执行它们,并在屏幕上显示输出。

  3. 在会话期间,创建一个临时文件“PID.cmd”(PID是进程ID),以下列格式(index:command)存储命令历史记录:

    1:ls
     2:ls -l

  4. 如果脚本被 CTRL + C (信号2)中止,则输出“由ctrl + c中止”的消息。

    < / LI>
  5. 当您退出记录会话时(通过“退出”或 CTRL + C ),

    一个。删除临时文件

    湾打印会话中的命令总数以及成功/失败命令的数量(根据退出状态)。

  6. 到目前为止,这是我的代码(不顺利,我不会尝试运行它):

      #!/bin/sh
      trap 'exit 1' 2
      trap 'ctrl-c' 2
    
      echo $(pwd)
      while true
      do
        read -p command
        echo "$command:" $command >> PID.cmd
     done
    

    目前,当我运行此脚本时,我得到了

    command read: 10: arg count
    

    是什么造成的?

    == UPDATE ======

    好的,我取得了一些进展,并没有像我的bashtrap或增量索引那样完全没有工作

    #!/bin/sh
    index=0
    trap bashtrap INT
    bashtrap(){
         echo "CTRL+C aborting bash script"
    }
    echo "starting to log"
    while : 
    do
        read -p "command:" inputline
        if [ $inputline="exit" ]
        then
                echo "Aborting with Exit"
                break
        else
                echo "$index: $inputline" > output
                $inputline 2>&1 | tee output
                (( index++ ))   
        fi
    done 
    

2 个答案:

答案 0 :(得分:2)

这可以通过bash或perl或其他方式实现。

一些提示让你开始使用bash:

问题1 :命令提示符/ logger / home / it244 / it244 / hw8
1)确保用户.bashrc设置文件中的提示格式:请参阅类似于debian的发行版的PS1数据。
2)在你的bash脚本中cd进入该目录。

问题2 :运行用户命令
1)获取用户输入

read -p "command : " input_cmd

2)将用户命令运行到STDOUT

bash -c "$input_cmd"

3)跟踪用户输入命令退出代码

 echo $?

如果一切正常,你应该以“0”退出(你也可以在命令手册页中找到退出代码)。

3)如果退出代码为Ok,则跟踪命令PID

 echo $$ >> /tmp/pid_Ok

但要注意的问题是保持用户命令输入,而不是PID本身,如下所示。

4)出口陷阱
当你误解了这个问题时,你会看到man trap:你可以在catched exit或CTRL / C信号上创建一个函数。

5)在while循环中递增索引(在退出代码条件下)

index=0
while ...
   do
   ...
   ((index++)) 
   done

我猜你有足够的时间开始你的家庭工作。

答案 1 :(得分:1)

由于发布的示例使用了sh,我将在我的回复中使用它。您需要将每个需求分解为其特定的支持代码行。例如,为了“提供包含工作目录的命令提示符”,您需要实际打印当前工作目录作为 read 命令的提示字符串,而不是设置{{1}变量。这导致$PS命令看起来像:

read

(我使用前导下划线表示私有变量 - 只是风格问题。)

类似地,要求在陷阱或正常出口上执行多项操作建议应创建一个函数,然后可以由陷阱调用或根据用户输入退出循环。如果你想漂亮打印退出消息,你也可以将它包装在echo命令中,它可能如下所示:

read -p "`pwd -P`\$ " _command

因此,在分析了每个要求之后,您需要一些计数器和一些粘合代码(例如while循环)来包装它们。结果可能如下所示:

_cleanup() {
   rm -f $_LOG
   echo
   echo $0 ended with $_success successful commands and $_fail unsuccessful commands.
   echo
   exit 0
}