我正在尝试从终端中的命令字符串传递参数。我正在修改一个脚本来检测该命令并允许用户查看该脚本正在做什么。
这就是我想要检测的。
[root@linuxtest] ./testscript.sh $1 -v
此命令用于详细说明脚本对终端执行的操作,并将其记录到日志文件中。现在,根据用户的不同,该脚本将检测用户输入的命令:
sh testscript.sh $1 -v
或者
./teshscript.sh -v
现在,脚本中已经有一个命令:
执行 1> {日志} 2>&1
这允许将回声记录到文件中。但是,这不会显示在终端中,而是记录到存储 {LOG} 文件的任何路径的文本文件中。我现在拥有的是这样的:
name=`sh testscipt.sh $1 -v`
if [[ -n "$name" ]]; then
2>&1 2>&- | tee -a ${LOG}
else
1> {LOG} 2>&1
fi
但我不太确定何时进行设置的逻辑应该是什么。我研究了“getops”以允许这种情况,但我不太确定其语法是什么。因此,本质上,我试图允许用户运行它,但是当他们想要查看它时,他们必须输入所述命令才能查看终端中的回声。
使用 getops/case 作为开关并传递用户输入命令时要检测的参数来执行此操作的正确方法是什么?
答案1
重定向和管道不是命令的一部分;它们是管道的结构之间命令。因此,您将无法通过查看命令行参数来查找重定向标准输出或标准错误的参数。
但是,您可以查看/proc/$$/fd
并查看链接到哪些0
(标准输入)、1
(标准输出)和(标准错误)。2
$ cat foo.sh
#!/bin/bash
echo "My pid is $$"
ls -l /proc/$$/fd/
$ ./foo.sh 2> /tmp/errorsgohere
My pid is 30842
total 0
lrwx------ 1 username username 64 Jun 28 14:33 0 -> /dev/pts/0
lrwx------ 1 username username 64 Jun 28 14:33 1 -> /dev/pts/0
l-wx------ 1 username username 64 Jun 28 14:33 2 -> /tmp/errorsgohere
lr-x------ 1 username username 64 Jun 28 14:33 255 -> /home/username/foo.sh