nftables構文のバックスラッシュ(\)位置

nftables構文のバックスラッシュ(\)位置

Webページでは、次のように説明します。
nftablesガイド

; = more commands or parameters to follow
\ = break a rule into multiple lines

コマンドの場合:

nft add chain ip traffic-filter output { type filter hook output priority 0 \; policy accept\; }

私はそれを次のように読んだ。

nft add chain ip traffic-filter output { 
          type filter hook output priority 0 ; 
          policy accept ; 
}

私を混乱させるのは、次のように行を壊すために\後ろに置かない理由です。:

nft add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}

ベストアンサー1

これは何の関係もないnftables構文ですが、POSIXシェル構文の場合:;エスケープする必要があります。それ以外の場合、シェルは区切り文字があると考え、新しいシェルコマンドが続きます。

この式はシェルで実行されます。

nft add chain ip traffic-filter output { type filter hook output priority 0 \; policy accept\; }

シェルの次の式と同じです。

nft add chain ip traffic-filter output '{ type filter hook output priority 0 ; policy accept; }'

または、多くの同様の可能性の1つです(nftパラメータ分割自体を実行するため、パラメータがグループ化される方法は重要ではありません)。

nft 'add chain ip traffic-filter output { type filter hook output priority 0 ; policy accept; }'

脱出口なしシェル用これが発生する可能性があります:

# nft add chain ip traffic-filter output { type filter hook output priority 0 ; policy accept; }
bash: syntax error near unexpected token `}'

エラーはで発生しませbashnft


どのランダム非公式文書盲目的に信頼しないでください。この文字の使用は\マニュアルページ(nft(8)):

語彙ルール

入力は1行ずつ解析されます。行の最後の文字(改行文字の前)が引用符で囲まれていないバックスラッシュ(\)の場合、次の行は連続と見なされます。。同じ行にある複数のコマンドは、;セミコロン()で区切ることができます。

ポンド記号(#)はコメントを開始します。同じ行の後続のすべての文字は無視されます。

識別子はアルファベット文字(a- zA- Z)で始まり、その後にゼロ個以上の英数字(a- zA- Z0- 9)、および文字スラッシュ(/)が続きます。バックスラッシュ( \)、アンダースコア(_)、ドット(.)。他の文字を使用するか、キーワードと競合する識別子は"二重引用符()で囲む必要があります。

バックスラッシュがどのように使用されているかを確認してください。( \) は改行文字の前にのみ特別な意味があります。(上記の説明とは異なり、/自由に受け入れられる場所を見つけることができなくても\)。問題が発生したくない場合常に一重引用符(')コマンドシェルの相互作用を防ぎ、内部的に適していると思われるようにしてください。ただし、これらの単一引用符内でバックスラッシュの後にスペースが続く場合は、次のように処理されます。二つコマンドの一般文字ですnft

したがって、いくつかのオプションがあります。

  • \+使用新しいチーム単一のコマンドを複数行に分割

  • ;複数のコマンド(またはその構文を含むコマンドの一部)を1行にリンクするために使用されます。

  • aを;aに置き換える新しいチーム2つの接続を分割するコマンド

  • スクリプトではなく対話するときにnft -i入力された対話型コマンドを使用してシェルの対話を回避することを選択できるため、どのように動作するかを見るためにシェルとの「」または「;」相互作用を避けるために特別な注意は必要ありません。

  • それにもかかわらず、ルールセットを開発したら、それをファイルに保存して使用するのが最善ですnft -f

したがって、OPの2番目の例は次のように書くことができます(まだシェルで実行されています)。

nft 'add chain ip traffic-filter output { type filter hook output priority 0;\
policy accept;\
}
'

ただし、;接続と行接続の両方が役に立たなくなった場合は、次のように簡単に作成できます。

nft 'add chain ip traffic-filter output { type filter hook output priority 0
policy accept
}
'

バックスラッシュの後に改行文字がないため、次の表記法は無効です。

nft 'add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}'

nftバージョン0.9.8では、上記の問題に関していくつかのエラーが発生します。

Error: syntax error, unexpected junk
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
                                                                         ^
Error: syntax error, unexpected junk
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
                                                                                           ^
Error: syntax error, unexpected end of file
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
^

おすすめ記事