Raspberry-Pi

檢查是否存在重新訪問的命令

  • March 22, 2022

受此答案的啟發:當我type -p在命令提示符下執行時,如果命令存在,它會可靠地告訴我路徑:

pi@raspberrypi:~ $ type -p less
/usr/bin/less
pi@raspberrypi:~ $ type -p asdf
pi@raspberrypi:~ $ 

但是,當在腳本中使用時,就好像-p參數被解釋為自身的命令一樣。該type命令似乎忽略了它作為它的選項,因為結果中總是有一些流氓文本-p not found。它破壞了腳本的其餘部分:

#!/usr/bin/sh

main() {
   for mycommand in $1; do
       echo Checking $mycommand
       loc="$(type -p "$mycommand")"
       echo $loc
       if ! [ -f "$loc" ]; then
           echo I think I am missing $mycommand
       fi
   done
}

main "less asdf"

腳本的輸出:

Checking less
-p: not found less is /usr/bin/less
I think I am missing less
Checking asdf
-p: not found asdf: not found
I think I am missing asdf

你能幫幫我嗎?樹莓派上的外殼是否有導致這種情況的原因?

-p不是type命令¹的標準選項。該type實用程序本身,雖然標准在 POSIX 中是可選的(僅在實現 XSI 的系統上需要,但這是獲得 UNIX 合規性認證所必需的)。

代替type,您可以使用command -v來檢查命令的可用性。無需檢查其輸出,command將通過其退出狀態告訴您是否成功找到該命令(無論它是在 中找到的外部命令$PATH、內置命令還是函式):

#!/usr/bin/sh -

main() {
   for mycommand do
       printf >&2 '%s\n' "Checking $mycommand"
       if ! command -v -- "$mycommand" > /dev/null 2>&1; then
           printf >&2 '%s\n' "I think I am missing $mycommand"
       fi
   done
}

main less asdf

command是一個強制性的 POSIX 實用程序。該-v選項command過去是可選的,但在最新版本的 POSIX 規範中不再存在。

另請記住,echo不能用於顯示任意數據--必須用於分隔選項和非選項,錯誤(以及一般診斷,包括進度/建議資訊)最好轉到 stderr。


¹ 但是,它是、 、 、 和shells²的內置函式支持type的選項。在and中,它意味著在標準中搜尋命令(例如由返回),在 中,它僅用於在 中搜尋命令,而不是在 aliases/builtins/functions 中。中相同,除了它也只列印找到的命令的路徑。在(以前的位置;儘管不再記錄但仍受支持),如果命令是內置命令,則成功但不列印任何內容,並且僅在 ksh93 中列印路徑,當它是外部命令時。在中,它的行為類似於bash``mksh``ksh93``busybox ash``zsh``yash``mksh``yash``$PATH``getconf PATH``zsh``$PATH``ksh93``bash``-path``type -p``busybox ash``command -v

sh²至少在呼叫 as 時,標準語言的所有或多或少一致的解釋器實現sh,儘管這並不妨礙它們在標準未指定行為的區域中支持對該語言的擴展,如此處。

引用自:https://unix.stackexchange.com/questions/696353