Bash
Bash 腳本如何知道它是如何執行的?
我有一個我試圖製作的 Bash 腳本來幫助我執行一個相當複雜的命令,它會通過 echo 和 read 詢問我的一些小改動。
我找到了強制它執行終端來執行命令的解決方案,但我對此不感興趣。我想要它做的是,如果我在 Nautilus 中留出空間並按 Enter 鍵(使其與 Run Software 一起執行),它只會輕輕彈出一條通知,說“請從終端執行它”。
我可以讓彈出視窗發生——就像我知道命令一樣——但我無法讓 Bash 腳本判斷它是否在終端內執行,它似乎總是這樣認為。甚至可能嗎?
從
man bash
條件表達式下:-t fd True if file descriptor fd is open and refers to a terminal.
假設 fd 1 是標準輸出,
if [ -t 1 ]; then
應該適合你。Advanced Shell Scripting Guide聲稱使用這種-t
方式將失敗轉移ssh
,因此測試(使用標準輸入,而不是標準輸出)應該是:if [[ -t 0 || -p /dev/stdin ]]
-p
測試文件是否存在並且是命名管道。 但是,我從經驗上註意到這對我來說不是真的:-p /dev/stdin
普通終端和 ssh 會話都失敗,而if [ -t 0 ]
(或-t 1
)在這兩種情況下都有效(另請參閱下面的 Gilles 評論,關於Advanced Shell Scripting Guide的該部分中的問題)。如果主要問題是您希望從中呼叫腳本以適合該上下文的方式執行的特定上下文,則可以迴避所有這些技術性並通過使用包裝器和自定義變數來省去一些麻煩:
!#/bin/bash export SPECIAL_CONTEXT=1 /path/to/real/script.sh
呼叫這個
live_script.sh
或其他什麼,然後點兩下它。您當然可以使用命令行參數完成同樣的事情,但是仍然需要一個包裝器來指出並點擊 GUI 文件瀏覽器工作。