嘗試測試命令存在或不使用簡單的腳本執行殼腳本直接從在Ubuntu使用sh命令不同12.04
$ cat test.sh
command -v nwef
echo $?
$ sh test.sh
127
$ ./test.sh
1
$ bash test.sh
1
於CentOS 6.5,結果始終是1
任何人都知道爲什麼「sh test.sh」是不同的?
嘗試測試命令存在或不使用簡單的腳本執行殼腳本直接從在Ubuntu使用sh命令不同12.04
$ cat test.sh
command -v nwef
echo $?
$ sh test.sh
127
$ ./test.sh
1
$ bash test.sh
1
於CentOS 6.5,結果始終是1
任何人都知道爲什麼「sh test.sh」是不同的?
sh
在Ubuntu中是破折號而不是bash。
退出狀態的不同之處在於您對內建的command
以及Bash和Dash如何區別對待它們的使用。
在man bash
:
command [-pVv] command [arg ...]
... 如果-V或-v選項,退出狀態是0,如果發現命令,1,如果不是。如果 沒有提供任何選項並且發生錯誤或找不到命令,則退出狀態爲127.否則,命令builtin的退出狀態爲命令的退出狀態。
這就是爲什麼你用Bash得到exit 1
。
因爲短跑不把在command
-v
選項,bash所做的,它把nwef
爲「未找到命令」,這是exit 127
。
我認爲這裏也要注意Debian如何處理./test.sh
與sh test.sh
的不同。由於該腳本不包含到像#!/bin/sh
這樣的解釋器的shebang路徑,所以運行./test.sh
默認爲#!/bin/bash
而不是#!/bin/sh
,並將command
的使用與exit 1
對待。不幸的是,我在文檔中找不到對此的解釋。
即,'command'命令本身沒有找到。 – chepner
'命令'內建函數也包含在Dash中,我認爲它不會像Bash那樣處理'-v'選項。發佈更新。 –
檢查什麼是sh。我猜想debian派生系統有一個像'/ bin/ash'或'/ bin/sash'這樣的奇怪野獸作爲「基本shell」。如果是,那麼你應該檢查'command'行爲,我不知道它是什麼 – user3159253