一部の「通常の」ファイル名を処理するシェルスクリプトを作成しましたが、「シェルスクリプトが空白やその他の特殊文字で詰まるのはなぜですか?」を読みました。そしてなぜあなたはLSの出力を解析べきではないと私はそれがより堅牢でかつ有効な任意のファイル名(および/またはディレクトリ名)を処理したいと思います。スクリプトを実行するファイルとディレクトリのテストベッドを作成するにはどうすればよいですか?
一部の「通常の」ファイル名を処理するシェルスクリプトを作成しましたが、「シェルスクリプトが空白やその他の特殊文字で詰まるのはなぜですか?」を読みました。そしてなぜあなたはLSの出力を解析べきではないと私はそれがより堅牢でかつ有効な任意のファイル名(および/またはディレクトリ名)を処理したいと思います。スクリプトを実行するファイルとディレクトリのテストベッドを作成するにはどうすればよいですか?
回答:
再生する別のディレクトリを作成します(主に後でクリーンアップを簡単にするため)。これは、$TMPDIR
設定されている場合はの値を使用し、それ以外の場合は/tmp
:
mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"
別個のファイルを作成しますが、空白(スペース、タブ、改行、復帰、バックスペース)のために互いに似ています。
touch -- a b 'a ' 'b ' 'a b' 'a b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b
上記のパトリックへのクレジット。2つの16進コードの1つは、nutおよびmuttonとして知られるUTF-8スペースセパレーターです。「双方向のコンテキストでは、ホワイトスペースとして機能し、ミラーリングされません。グリフは、状況によっては、他の20個のグリフと混同される可能性があります。」
プレーンファイルと、それがグロブとして扱われた場合に最初に展開されるファイルを作成します。
touch -- x '[x]'
Wumpus Q. Wumbleyへの上記のクレジット。
同じような調子で:
touch -- 'a?b' 'a*b'
ここのコメントで上記のdave_thompson_085へのクレジット。
touch -- foo\`echo\ malicious\`bar
godlygeekへの上記のクレジット。
シェルコンテキストで評価された場合に別の何かに(そして潜在的に任意の実行に!)展開するファイル名:
touch '$( echo boom )'
使用する:
touch -- single\'quote double\"quote back\\slash
引用符をエスケープせずにファイル名を引用符で囲む試みをキャッチする。
touch -- -a -b -c -r -R - a=x
上記のクレジットはStéphaneChazelasに帰属します。
名前付きパイプとシンボリックリンクを作成します(「通常」ではないファイルを作成します):
mkfifo fifo
ln -s a alink
名前にさまざまな空白が含まれるサブディレクトリと、その中にあるトークンファイルを作成します。
mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4
*
(通常の削除に問題がある可能性がある)のみを含むファイル名、(通常の!)スペースのみで構成されるファイル名、デッドシンボリックリンク、それ自体にループするシンボリックリンク、および親ディレクトリに戻るリンクを持つサブディレクトリを作成します。
touch -- '*' '**' '***' ' '
ln -s /does/not/exist dead
ln -s loop loop
mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)
その他のファイル名。最後の2つは、「フラクショナルスラッシュ」と「ディビジョンスラッシュ」のUnicodeです。
touch -- '(' '!' '!!' $'\xe2\x81\x84' $'\xe2\x88\x95'
スコットからのアイデア:
touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'
一部のロケールでは無害であるが他のロケールでは危険な文字:
touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
# "blank" and "space" in some locales
touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
# �\ and �` in ASCII
一部のロケールで同じようにソートされる文字:
touch ① ② # sorts the same in GNU locales, order non-deterministic.
.[!.]* *
グロブをエスケープするファイル(隠しファイルと非隠しファイルの両方を展開するために使用される場合があります):
touch ..foo ...
a?b
しますa*b
(もちろん引用されます)。@muru:バイトシーケンスE2 80 82/83は、U + 2002 EN SPACEおよびU + 2003 EM SPACEのUTF-8エンコーディングです
-
し、--
スクリプトの要件に応じて、多分招くことなく、それらにアクセスすることは不可能である必要があり、にもかかわらず、./
。そして、私はのような、非グロブシェルの特殊文字と非常に少ないがあることを驚いている;
、&
、|
、<
、>
、$
、(
、)
、{
、}
、=
、\
、!
、および#
、例えば- {a,b}
。