'/'
私は2文字のsum以外にLinuxのファイル名に制限がないことを知っています'\0'
。'/'
ディレクトリ区切り記号なので禁止されていることを知っていますが、他に理由がありますか??
また私のターミナルで\0
。だから私は知りたいヌル文字を書く正しい方法明らかに、nullを含むファイル名を許可しないでください。
mkdir '\0'
という名前のファイルを生成します\0
もう一つ質問があります。ファイル名に含めるには$
バックスラッシュを使用できます。
mkdir \$myfile
という名前のファイルを生成します $myfile
ただし、ドル記号を一重引用符と二重引用符で囲んでも、これを行うことができます。
mkdir \$myfile
同じ、同じ、同じ、mkdir '$'myfile
同じmkdir "$"myfile
。mkdir '$myfile'
mkdir "$myfile"
だから私の質問は、一重引用符と二重引用符は、バックスラッシュ文字をエスケープする代わりに使用できますか?
$
、(スペース)とバックスラッシュに加えて、bashでエスケープする必要がある他の文字は何ですか?
ベストアンサー1
ヌル文字の印刷
$'\0'
最近の多くのシェルでは、ドル一重引用符形式、16進形式\x00
、Unicode形式、または8進形式を使用して\u0000
NULL文字を作成できます。キーは、コマンドがバックスラッシュエスケープ文字を処理する方法を知る必要があることです。たとえば、通常はオプションを追加する必要がある場合です。\U00000000
'\0'
echo
-e
printf
%b
動作していることを確認しましょう。
$ echo -ne '\0'
$
だから何も生成されませんecho -ne ''
。
$ printf '%b' '\0'
$
いくつかの文字を追加してみましょう(printf '%b'
もっと強力ですが、同様の効果があるので、今から使い続けますecho -ne
)。
$ printf '%b' a'\0'b
ab
2文字だけが印刷されます。無効行く?
$ printf '%b' a'\0'b | wc -c
3
比較してみましょうa''b
:
$ printf '%b' a''b | wc -c
2
最後に、ファイルを生成する前に実際にnull文字を印刷したことを確認するために、印刷された値をエラーを発生させるコマンドに渡しましょう。例xargs
:
$ printf '%b' a'\0'b | xargs echo
xargs: Warning: a NUL character occurred in the input. It cannot be
passed through in the argument list. Did you mean to use the --null option?
a
a
最後に印刷する方法を確認してください。もちろんxargs -0
うまくいきます。
$ printf '%b' a'\0'b | xargs -0 echo
a b
nullを使用してファイルを生成しますか?
それでは、null文字を含むファイルを作成しましょう。
$ touch $'\0'
touch: cannot touch ‘’: No such file or directory
$ mkdir $'\0'
mkdir: cannot create directory ‘’: No such file or directory
# let's try another approach - using printf in command substitution:
$ touch "$(printf '%b' '\0')"
touch: cannot touch ‘’: No such file or directory
$ mkdir "$(printf '%b' '\0')"
mkdir: cannot create directory ‘’: No such file or directory
結果は と全く同じですtouch ''
。無効一斉に無視されました。コマンドの代わりに二重引用符をスキップするとどうなりますか?
$ touch $(printf '%b' '\0')
touch: missing file operand
Try 'touch --help' for more information.
$ mkdir $(printf '%b' '\0')
mkdir: missing operand
Try 'mkdir --help' for more information.
これは、パラメータがまったくないtouch
場合と同じです。mkdir
もう一つの結果は、nullをテキストで囲む場合です。
$ touch "$(printf '%b' a'\0'b)"
$ ls
a # in zsh
ab # in bash
標準出力にリダイレクトすることもできますが、$'\0'
取得するのはすべて他の種類のエラーだけです。