如何在不退出 SSH 用戶端的情況下從命令列設定返回代碼?

如何在不退出 SSH 用戶端的情況下從命令列設定返回代碼?

我對 Unix 真的很陌生,目前我需要建立一個別名來檢查檔案是否規則且可讀。如果它不規則,那麼我需要返回 1 作為退出程式碼,而不是測試它是否可讀。如果它不可讀,我需要返回 2 作為退出代碼。

alias test="if [ ! -f filename ] ; then echo 'Irregular file'; exit 1 ; fi; if [ ! -r filename ]; then echo 'Unreadable file'; exit 2; fi;

現在的問題是,當我運行它時,退出將關閉我的整個客戶端。有辦法解決這個問題嗎?

答案1

因為這是在 Google 中進行搜尋時的第一個連結:

如果將出口括在括號中

(exit 2)

然後它將透過退出括號中的子 shell 來設定回傳代碼,並且不會退出目前的 shell。然後您可以使用 $? 測試該程式碼。像平常一樣

alias mytest="if [ ! -f filename ] ; then echo 'Irregular file'; (exit 1) ; elif [ ! -r filename ]; then echo 'Unreadable file'; (exit 2); fi"

答案2

shell 函數應該能夠獲得return您喜歡的值:

checktype() {
    if [ ! -f "$1" ] ; then 
        echo 'Irregular file'
        return 1
    fi 
    if [ ! -r "$1" ]; then 
        echo 'Unreadable file'
        return 2 
    fi
    return 0
}
$ checktype /dev/stdin ; echo $?
Irregular file
1

另外,test對於別名或函數來說,這是一個糟糕的名稱,因為它是一個標準(內建)實用程式。


我意識到別名是一個糟糕的選擇,但目前教授要求使用別名。

好吧,這改變了一些事情。我的建議是向教授展示一種更合適的解決方案,並解釋為什麼簡單的解決方案不起作用。

但萬一這行不通,而你真的必須使用別名,請考慮傳回值實際上只是執行的最後一個命令的回傳值。你應該能夠組裝一些東西來返回你想要的值...

(如果是家庭作業,我認為立即給出完整的解決方案是不公平的。下面有劇透。)

提示:您已經使用了傳回任意值的命令。

答案3

alias這裡是一個糟糕的選擇。將這些行放入 bash 腳本檔案中。

#!/bin/bash
if [ ! -f filename ];
 then echo 'Irregular file'; exit 1 ;
fi;
if [ ! -r filename ];
 then echo 'Unreadable file'; exit 2;
fi;

它將按預期工作。

相關內容