1. 程式人生 > >檔案重定向至指令碼 tty命令妙用

檔案重定向至指令碼 tty命令妙用

前兩天遇到一個很棘手的問題:
我有一個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是系統分配的。