bash
コマンドの交換によって末尾の改行文字が削除されるのを防ぐためのオプションが提供されていれば幸いです。あなたはいますか?そうでなければ、POSIXのようなシェルはありますかbash
?標準(POSIXのようです)sh
コードを実行するシェルはありますか?そのようなオプションがあるか、改行文字を削除しない特別なコマンド代替構文があるかもしれません(後者がより良い)。 )?
ベストアンサー1
(私が知っている限り)これを直接実行するオプションはありませんが、コマンドの置き換えに改行ではなく保護文字を追加してから削除して偽にすることができます。
var="$(somecommand; echo .)" # Add a "." (and one newline that command
# substitution will remove) *after* the
# newline(s) we want to protect
var="${var%.}" # Remove the "." from the end
との終了状態は両方とも状態が設定されているsomecommand
ため(通常0)、プロセスで失われます。最後まで保存する必要がある場合は、ジャグリングを追加する必要があります(Kusalananda提供)。echo .
var=${var%.}
var="$(somecommand; err=$?; echo .; exit "$err")" # Make the subshell
# exit with somecommand's
# status
commandstatus=$? # Preserve the exit status of the subshell
var="${var%.}"
# You can now test $commandstatus to see if the command succeeded
err
と変数はすべてcommandstatus
コマンドの終了状態を格納しますが、err
によって生成されたサブシェルにのみ存在し、親$( )
シェルcommandstatus
にのみ存在するため、重複しません。両方に同じ名前を使用できますが、これは混乱を引き起こす可能性があります。
さて、「。」後ろに状態を保存する必要がない場合は、切り捨ててこのcommandstatus
部分をスキップできます。
if var="$(somecommand; err=$?; echo .; exit "$err")"; then
# somecommand succeeded; proceed with processing
var="${var%.}"
dosomethingwith "$var"
else
echo "somecommand failed with exit status $?" >&2
fi
ロケールに応じて「。」代わりに、どの文字も使用できません。 POSIXは「。」エンコーディングが他の文字エンコーディングで見つからないことを保証しますが、すべての場合に当てはまるわけではありません。たとえば、実際には「x」のエンコーディングは、BIG5またはGB18030エンコーディングの多くの文字のエンコーディングの終わりにあるため、「。」代わりに「x」を追加すると、「x」は次のように終了できます。出力の終わりに現れる他のバイトの組み合わせは新しい文字を形成し、 "${var%x}" は "x" を削除できません。