2012-03-25 130 views
2

我有一個腳本的第一行內容的字符串的名稱,如慶典:找到解釋

#!/bin/bash

,但它可以是任何東西,如

#!/path/to/another/interpret -some args -another arg

哪有我通過省略路徑和參數來提取解釋器的名稱 - 「bash」,「解釋」?

我雖然關於找到第一個空白區分路徑的參數。

你能幫忙嗎?

+0

你說的 '提取' 是什麼意思?你在哪裏以及如何獲得這些信息?腳本里面? – Bernhard 2012-03-25 09:54:52

+0

你確定一個shebang中的路徑可以包含空白嗎? – user123444555621 2012-03-25 09:55:04

+0

它不像我「知道如何去做」,但是,你可以做的是使用〜some〜命令將「/」字符串作爲分隔符分隔開,並使用結果字符串數組的最後一個值...我猜測sed或awk或grep(和正則表達式)可以幫助你。例如grep -Po「/ [a-z,A-Z] {0-30} $」可以工作,但我不確定。基本上應該匹配「/ bash」,「/ sh」,但不是「/ some」。希望這個〜kinna〜有幫助 – 2012-03-25 09:58:14

回答

2

我不認爲你可以在shebang中使用空格。如果你不能,你可以找到解釋名字是這樣的:

interpreter=`cat test.sh | head -n 1 | cut -d' ' -f 1` 
basename $interpreter 

編輯: 縮短版本:

interpreter=$(basename $(sed '2q;s/^#!//;s/ .*//' test.sh)) 
+1

可以直接使用'head -n 1 test.sh' – okm 2012-03-25 10:18:07

+0

ye,比上面更簡單的版本: 'interpreter = basename \'head -n 1 test.sh \'' – wisent 2012-03-25 10:26:43

+0

你確實需要在'#!' - '#之後留出空格!/bin/sh'工作得很好。 – 2012-03-25 11:58:47

0
$ basename '#!/path/to/another/interpret -some args -another arg'|awk '{ print $1}' 
interpret 
0
set -- $(head -1 scriptname) 
case $1 in 
    "#!") 
    # whitespace after the #!, the interpreter is the 2nd word 
    interp=$2 
    ;; 
    "#!"*) 
    # no whitespace, strip the first 2 chars from the 1st word 
    interp=${1#??} 
    ;; 
    *) 
    echo no shebang at all 
    exit 
    ;; 
esac 
interp=$(basename "$interp")