2014-05-11 22 views

回答

3

據我所知,這是不可能的,因爲Bash試圖遵循POSIX準則和其他標準。 特別:

如果<newline>反斜槓後,外殼應解釋爲續行。在將輸入分解爲令牌之前,應去除反斜槓和<newline>。由於轉義的<newline>被完全從輸入中刪除,並且不被任何空格替換,因此它不能用作令牌分隔符。
- shell命令行語言2.2.1 Escape Character (Backslash)

因此,它是不可能的,因爲殼分析器是如何工作的:

  • 開始#的行是註釋,並沒有什麼後獲取評估(包括尾部\
  • A \不在行尾,是而不是行跳過。

在你的腳本:

ls -l \ 
-a \ 
# comment here 
-h \ 
-t . 

註釋行被替換爲空(即它沒有令牌);並且由於該命令到目前爲止有效,並且滿足換行符(… -a ↵),因此shell運行ls -l -a命令,然後運行-h -t .命令(並且在$PATH中找不到-h二進制文件,因此它會在此處停止。 )

+0

在您的最後一段中,遇到的換行符位於註釋的結尾處,而不是在「-a」後面。 – spkersten

+0

@spkersten這是真的,我還不夠清楚(我用空格字符來表示一個換行符,但我應該用代替)。謝謝! – Diti

0

我不認爲你可以直接做到這一點,因爲評論去除比反斜線線連接前完成的,所以這是行不通

# commenting \ 
seveal lines 

顯而易見的解決方案是使用#上每一行:

# commenting 
# seveal lines 

如果你想有創意,你可以使用一個骯髒的伎倆:

: 'This is almost 
a multiline comment' 

實際上並不是一條評論,但它什麼都不做,除了將退出代碼更改爲0.

0

這是不可能的。因爲反斜線線繼續者和註釋的單個字符,這使得其忽略,直到行尾右側的一切:

ls \ 
# -l \ 
-h 

-l會被忽略,在ls命令執行,被認爲是新的命令-h

因爲在類似C的語言中你有意見的邊界:/* */可以將這些標記放置在使用行連續的表達式中。

1

不是直接,給你買可以把這樣的註釋放在數組中。 (這也可以讓你拆分到多個線路的參數,而無需使用續行。)

cmd_options=(
    -l 
    -a 
    # comment here 
    -h 
    -t . 
) 
ls "${cmd_options[@]}" 
2

在這種情況下,我通常的東西去像

ls -l -a -h -t . 
# | | | time sort 
# | | human readable 
# | all files 
# long format 

或我使用參數的長表當他們存在時,例如--human-readable而不是-h

+1

現在想象一下,你的實際命令行由多個參數組成,每個參數都帶有一個字符串,因此整個命令需要多行。 – tijagi

+0

@tijagi在這種情況下,我會按照組的方式將參數分配給具有有意義名稱的變量,例如,通常在Makefile中進行。然後,您可以將變量賦值與註釋交錯。 – damienfrancois

0

...它可以管後進行:

echo "Hello beautiful" | \ 
# Display match only: 
grep -o beautiful 

但是,否則......沒有。

1

你可以做這樣的事情有一個數組,它不需要繼續符:

ls_cmd=(
    ls 
    -l # long form 
    -a # show hidden files 
    -h # human-readable sizes 
    -t # sort by time 
    . 
) 

"${ls_cmd[@]}" # run the command from the array 

...但一般情況下,答案是否定的。