前两天遇到一个很棘手的问题:
我有一个shell脚本,例如test.sh
执行的时候不接收参数或者接收文件重定向两种方式
./test.sh
or
./test.sh < test.txt
看似简单的要求,但是理想与现实之间总是会有差距,以为使用一些位置变量$1,$2或特定变量$#等就可以搞定
但是发现这两种情况的值完全一样,以至于无法区分这两种情况.($#均为0,$1,2等均为空,cat $1时不重定向时会阻塞等)
询问了CSDN上的大虾,终于搞定,tty命令大展身手。
$ man tty
NAME
tty - print the file name of the terminal connected to standard input(打印与标准输入设备连接的终端名称,翻译的有问题的请指出来)
SYNOPSIS
tty [OPTION]...
DESCRIPTION
Print the file name of the terminal connected to standard input.
-s, --silent, --quiet
print nothing, only return an exit status(不打印名称,直返回一个退出状态,退出状态我查了一下,0--标准输入是一个终端,1--标准输入不是终端,2--传递了错误参数,3--写入错误产生)
一下处理就能区分出那两种情况了
test.sh
#!/bin/sh
tty -s
if [ $? -ne 0 ]; then
echo "输入重定向"
else
echo "no重定向"
fi
or
if [ "$(tty)" != "not a tty" ]; then
echo "it's a terminal"
else
echo "not a terminal"
fi
怎么样,很巧妙吧。
当然
$ tty
/dev/pts/1
打印出了当前终端的ID,后面的数字1是系统分配的。