我正在尝试做家庭作业,这非常令人困惑。我不确定教授的例子是用Perl还是bash,因为它没有标题。基本上,我只需要帮助解决问题:捕获输入并输出它。这是作业:
在会话中,提供包含工作目录的命令提示符,例如,
$./logger/home/it244/it244/hw8$
接受用户的命令,执行它们,并在屏幕上显示输出。
在会话期间,创建一个临时文件“PID.cmd”(PID是进程ID),以下列格式(index:command)存储命令历史记录:
1:ls
2:ls -l
如果脚本被 CTRL + C (信号2)中止,则输出“由ctrl + c中止”的消息。
< / LI>当您退出记录会话时(通过“退出”或 CTRL + C ),
一个。删除临时文件
湾打印会话中的命令总数以及成功/失败命令的数量(根据退出状态)。
到目前为止,这是我的代码(不顺利,我不会尝试运行它):
#!/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
答案 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
}