コマンド置換は、すべての末尾の改行を削除します。
1つを削除することは理にかなっています。例えば:
basename foo/bar
出力しますbar\n
。の:
var=$(basename foo/bar)
ではなく、$var
を含めたい。bar
bar\n
しかし、
var=$(basename $'foo/bar\n')
含めたいと思い$var
ますbar\n
(結局のところ、改行はUnixのファイル名と同じくらい有効な文字です)。ただし、すべてのシェルは末尾の改行文字をすべて削除します。その欠陥は元の Bourne シェルにありrc
、Bourne の欠陥のほとんどを修正したものでさえ、その欠陥は修正されていません。(ただし、改行文字を削除しない構文があります)rc
。``(){cmd}
POSIX シェルでは、この問題を回避するには、次のようにします。
var=$(basename -- "$file"; echo .)
var=${var%??}
その後、の終了ステータスを失っていますがbasename
。あなたが修正できるもの:
var=$(basename -- "$file" && echo .) && var=${var%??}
${var%??}
最後の 2 文字を削除することです。1 つ.
目は上で追加したもので、2 つ目はによって追加された1 つのbasename
改行文字です。他の改行文字がある場合はファイル名の一部になるため、コマンド置換でこれ以上削除することはありません。のベースを取得するので、それらが必要です。
オペレーターを持たない Bourne シェルでは${var%x}
、それを回避するために長く複雑な方法を取らなければなりませんでした。