2016-04-21 71 views
4

"[email protected]"似乎使,消失。例如

param="123 1,2" 
set echo $param 
"[email protected]" 

例子將顯示「123 1 2」,而不是「123 1,2」,但在一些情況下,需要作爲值的命令。

而這似乎是與bash版本有關,bash 4.1.2,結果是正確的,但與4.2.46,逗號缺失。


編輯:

總之,也許是nice責怪:

我做unset IFS和終端的測試情況下,我都給工作正常,但不是我的腳本。

實際上,我工作的一個初始化腳本,我在/etc/init.d/functions檢查action()功能,並增加了一些調試代碼:

echo "[email protected]" # added by me 
unset IFS # added by me 
"[email protected]" && success $"$STRING" || failure $"$STRING" 

命令迴應是正確的(nice -n -10 ovs-vswitchd ... --socket-mem 1024,1024),但在ps結果由nice執行的實際命令變成ovs-vswitchd ... --socket-mem 1024 1024

我開始覺得可能是責怪nice

+1

檢查IFS是否已損壞。 – 123

+1

這看起來像是bash 4.1中的一個bug。我正在檢查[changelog for bash 4.2](https://github.com/sunny256/bash/blob/master/CWRU/changelog),看看是否有相關的東西。 – fedorqui

+0

其工作正常與版本4.2.47 ... – Joda

回答

0

請在分割參數之前直接在腳本中設置IFS(在命令set之前)。例如,做這樣的事情:

oldIFS=$IFS 
param="123 1,2" 
IFS=" " # put tabs and or newline if also wanted. 
set echo $param 
IFS=$oldIFS 
"[email protected]" 

無論你以前的IFS是什麼,這都可以工作。

+0

如果OP想要進行字符串分割,最好的做法是使用'read -a',而不是依賴於IFS。 'IFS = read -r -a args <<<「$ param」; set - echo「$ {args [@]}」'只在'read'命令期間修改'IFS',所以你不需要恢復並返回舊值 –

+0

......這很重要,因爲'oldIFS'方法有問題:如果舊值未設置('未設置IFS'),那麼上面的代碼會導致前後的行爲發生重大差異。 –