2014-02-08 68 views
2

嘗試測試命令存在或不使用簡單的腳本執行殼腳本直接從在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」是不同的?

+0

檢查什麼是sh。我猜想debian派生系統有一個像'/ bin/ash'或'/ bin/sash'這樣的奇怪野獸作爲「基本shell」。如果是,那麼你應該檢查'command'行爲,我不知道它是什麼 – user3159253

回答

3

sh在Ubuntu中是破折號而不是bash。

2

退出狀態的不同之處在於您對內建的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.shsh test.sh的不同。由於該腳本不包含到像#!/bin/sh這樣的解釋器的shebang路徑,所以運行./test.sh默認爲#!/bin/bash而不是#!/bin/sh,並將command的使用與exit 1對待。不幸的是,我在文檔中找不到對此的解釋。

+0

即,'command'命令本身沒有找到。 – chepner

+0

'命令'內建函數也包含在Dash中,我認爲它不會像Bash那樣處理'-v'選項。發佈更新。 –