无法理解shell脚本中的[-t 0]

时间:2012-01-20 23:17:05

标签: shell

defunkt github用户的browser要点以此shell表达式

开头
if [ -t 0 ]; then ...

这行代码的含义是什么?

更新:你能解释为什么我之前需要做这个检查吗?

为了完整起见,这里是整个小脚本(它允许将文本管道传输到默认浏览器):

 if [ -t 0 ]; then
  if [ -n "$1" ]; then  
    open $1
  else
    cat <<usage
Usage: browser
       pipe html to a browser

$ echo '<h1>hi mom!</h1>' | browser
$ ron -5 man/rip.5.ron | browser
usage

fi
else
  f="/tmp/browser.$RANDOM.html"
  cat /dev/stdin > $f
  open $f
fi

3 个答案:

答案 0 :(得分:4)

'[]'调用测试

-t使测试测试成为一个文件描述符,看它是否是一个终端

0是STDIN的文件描述符。

所以说

if STDIN is a terminal then ...

<强>更新

我必须阅读整个脚本才能确定,但​​通常是因为脚本想要做一些像浏览屏幕一样流畅的东西,或者以交互方式提示。如果你在管道上,那就没有意义了。

更新2

好的,我们来看看整个剧本:

# If this has a terminal for STDIN
if [ -t 0 ]; then
  # then if argument 1 is not empty
  if [ -n "$1" ]; then  
    # then open whatever is named by the argument
    open $1
  else
    # otherwise send the usage message to STDOUT
    cat <<usage
Usage: browser
       pipe html to a browser

$ echo '<h1>hi mom!</h1>' | browser
$ ron -5 man/rip.5.ron | browser
usage
#That's the end of the usage message; the '<<usage'
#makes this a "here" document.
fi  # end if -n $1
else
  # This is NOT a terminal now
  # create a file in /tmp with the name
  # "browser."<some random number>".html"
  f="/tmp/browser.$RANDOM.html"
  # copy the contents of whatever IS on stdin to that file
  cat /dev/stdin > $f
  # open that file.
  open $f
fi

所以这是检查你是否在终端上;如果是这样,它会查找带有文件名或URL的参数。如果不是终端,则它会尝试将输入显示为html。

答案 1 :(得分:2)

来自ksh手册(对于bash也是如此)。

-t fildescriptor    
   True, if file descriptor number fildes  is open and associated with a terminal device.

所以文件描述符0是std输入。

您的代码基本上要求我们以交互模式运行,或者我们处于批处理模式。

我希望这会有所帮助。

答案 2 :(得分:-1)

这对于检查shell脚本是由真实用户使用终端调用还是由crontab或守护程序调用(在这种情况下,stdin将不存在)非常有用。

如果[-t 0] --- >>是否已连接标准输入(通常是键盘)