[英]Strange behviour while parsing command line arguments c++
這是我以前從未見過的一個問題,並認為這將是值得分享的。 我不知道為什么會這樣。
這是我調用我的程序的方式:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3 | arg4 | arg5 -switch4 -arg6
每個開關用於指示不同類型的參數,我會相應地解析它們。
switch3出現問題,表示arg3
, arg4
, arg5
都對應同一個交換機,並使用|
字符。
出於某種原因,我可以完美地運行程序,但是當我嘗試使用gdb調試它時,我的程序during startup, program exited with code 127
崩潰during startup, program exited with code 127
錯誤。
這就是讓我感興趣的東西。 它還說bin/bash: arg4 not found
。 它在第一個|
之后就接受了論證 字符,現在我假設它將其視為管道字符,並嘗試調用bash腳本。
為什么會這樣? 編譯器是否采用整個命令行字符串並將空格分隔的標記視為不同的參數? 為什么|
被解釋不同? 我嘗試在反向引號""
添加arg3|arg4|arg5
,它工作正常。 我也嘗試將它們分開-
例如。 arg3-arg4-arg5
,這也很好用。
|
character在bash
有特殊含義:它創建一個管道 。
您的程序只能看到以下參數:
./foo -switch1 arg1 -switch2 arg2 -switch3 arg3
bash
解釋|arg4
語法意味着應該運行(不存在的) arg4
命令,並且./foo
的標准輸出應該通過管道輸入到arg4
的標准輸入中。 |arg5 ...
以相同的方式解釋。
要抑制此行為,請運行您的程序,如下所示:
./foo -switch1 arg1 -switch2 arg2 -switch3 'arg3|arg4|arg5' -switch4 -arg6
(注意引號)。
問題是|
是一個管道,所以你最終試圖調用shell無法找到的arg4。 你需要用它們中的管道引用內容,即"arg3|arg4|arg5"
:
./foo -switch1 arg1 -switch2 arg2 -switch3 "arg3|arg4|arg5" -switch4 -arg6
如果你很好奇,你可以查看bash陷阱 。 如果你沒有進行大量的shell編程,你可能不會經常看到這些問題,但是當你這樣做時可能需要一段時間來弄清楚發生了什么,所以從長遠來看,學習shell編程的更多信息會有所幫助。 我記得打過3號,我第一次找到一個好的解決方案花了一些時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.