2011-04-20 39 views
9

我認爲這將是容易的,但我已經浪費在這幾個小時。調用帶有空格的命令行自變量在bash腳本

我想從一個bash腳本中運行以下命令的CMake。在終端我鍵入

cmake -G "Unix Makefiles" . 

和它的作品。如果我將它完全複製到bash腳本中,它也可以工作。

但劇本是爲了在多個平臺上工作,它可能是「MSYS Makefile文件」,而不是「Unix的Makefile文件」。因此,我想將命令放在一個變量中,其中的內容取決於平臺並執行它。然而,這是我陷入困境的地方。我嘗試了所有我能想到的單引號或雙引號的組合,但沒有成功。

我要的是沿線

c="cmake . -G \"Unix Makefiles\"" 
exec $c 

的東西,但它始終會導致以下一些變化:

CMake Error: Could not create named generator "Unix 

我意識到,我可以做

if test [... this is unix ...] 
    cmake . -G "Unix Makefiles" 
else 
    cmake . -G "MSYS Makefiles 
fi 

但由於這個電話必須進行多次,我寧願避免它。

有什麼建議嗎?

+0

從那裏接受的答案做了我的伎倆。 – 2017-03-13 19:25:48

回答

2

使用eval告訴shell來重新解析命令行:

c="cmake . -G \"Unix Makefiles\"" 
eval "$c" 

另外,我喜歡使用數組,以避免不必要的反斜線和eval

# Store command in 4-element array: ["cmake", ".", "-G", "Unix Makefiles"]. 
# No backslash escapes needed. 
c=(cmake . -G "Unix Makefiles") 

# Ugly syntax for expanding out each element of an array, with all the spaces and 
# quoting preserved to ensure that "Unix Makefiles" remains a single word. 
"${c[@]}" 
+0

感謝您的快速回答。原來,eval $ c就是我所需要的。下一步是閱讀關於評估。 – Alain 2011-04-20 13:38:37

+2

@Alain:儘可能避免使用「eval」 - 對於這類問題來說,這是一個簡單的解決方案,但它往往會導致更多(更難以理解的)問題。 – 2011-04-20 14:16:44

0

調用上exec您字符串,你實際上最終執行cmake與以下參數:

1: . 
2: -G 
3: "Unix 
4: Makefiles" 

exec本身不解釋引號,但只是空間和傳遞的參數這樣的execve系統調用。你需要讓bash中通過使用內置的像eval解釋引號。

2

Bash FAQ救援:引號是語法(這意味着引號不是名稱的一部分),所以你應該得到這個預期的結果:

if test [.... this is unix ...] 
    target="Unix Makefiles" 
else 
    target="MSYS Makefiles" 
fi 
cmake . -G "$target" 

PS:eval is evil

+0

謝謝。這可能是最簡單的。 – Alain 2011-04-20 13:51:30

5

最好不要不必要地使用eval。儘量不要將該命令放入變量中。 你可以把選項作爲變量雖然

if [ ... ] 
    string="Unix makefiles" 
else 
    string="MSYS Makefiles" 
else 
    string="...." 
fi 
cmake -G "$string" #just call the command normally 
0

您也可以使用... | xargs bash -c '...'重新分析一個字符串作爲命令行參數。 (使用xargs可能,但是,不會是多個平臺的理想解決方案。)

# example: find file names with a space 
c=". -maxdepth 3 -name \"* *\"" 
printf '%s' "$c" | xargs bash -c 'set -xv; find "[email protected]"' arg0 2>&1| less 

另一種選擇是使用像shebang.c這樣的shebang助手!

http://semicomplete.googlecode.com/svn/codesamples/shebang.c