2017-08-13 79 views
1

我有不同的命令組成的文本文件時,未找到:慶典 - 命令解析與命令的文本文件

set +e; false; echo $? 
(false;   echo foo); echo \ $? 
for i in .; do (false; echo foo); echo \ 1:$?; done; echo \ 2:$? 

等。

我想在整個bash子進程中使用set -e一行一行地測試這些命令,然後檢查父bash進程中的錯誤代碼以查看該子進程是否退出並顯示錯誤。我被困在如何處理更簡單的命令(例如上面列出的第一個命令)。這是我最近的嘗試之一:

mapfile file < "$dir"/errorData 
bash -c "${file[0]}" 
echo $? 

回報

bash: set +e: command not found 
bash: false: command not found 
bash: echo 127: command not found 

我試過幾個變種沒有運氣。使用bash -c \'"${file[1]}"\'會導致發現一條關於未找到命令的錯誤消息,現在將上述三個字符串合併爲一個長字符串。當然,只需用強引號將文件命令打包並直接在交互式shell中將它們提供給bash即可。

編輯:我使用的是bash 4.4.12(1)

+0

我不能在Bash v4.3.48上重現這些錯誤。一切正常。 – randomir

+0

您確定要執行(-c)「$ {file [0]}」嗎?或者您是否想要執行該操作? 「$ {file [0]}」? – yacc

+0

@yacc沒有-c,命令失敗,因爲bash正在等待文件或目錄。 – LumpyGrads

回答

1

任何人誰認定的殼解析其文本的方式,似乎違反參考手冊,請務必檢查任何複製輸入數據用於不可見的控制字符。例如。我在輸入文件中找到了一個非破壞性空間來代替簡單的空白,看起來像是一個簡單的空白。從網頁複製到編輯器或命令行時,這尤其常見。 bash使用空格,製表符和換行符來標記化,而不是非空白空間(Unicode標準中的U + 0020)。十六進制編輯器,例如hexfiend,可以幫助解決類似的問題。

+0

您粘貼的數據不包含任何非破壞性空間(U + 0020是常規空間,U + 00A0是非破壞性空間)。這是爲什麼總是將測試用例複製到新目錄並運行它的好主意之一。 –

+0

我輸入了你在這裏看到的數據,因爲它只是幾十行的樣本。我粘貼了我使用的實際數據。 – LumpyGrads