檔案重定向至指令碼 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是系統分配的。