シェルコマンドは、端末とスクリプトで異なる方法で実行されます。

シェルコマンドは、端末とスクリプトで異なる方法で実行されます。

次のコマンドシーケンス

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

端末sourceまたは出力で実行されたとき

b\\_d

sciptで実行するとき

sh script.sh

スクリプトの内容は次のとおりです。

#!/bin/bash                                                                                                                                   
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch

出力は次のとおりです

b\_d

端末の出力がデフォルト出力です。シェルスクリプトを使用するソリューションは何ですか?修正方法のアイデアも答えとして受け入れられます。

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`

のためのsh

私はbashシェルを使用します:

echo $0
bash

ベストアンサー1

sh違うbash、違う行動をします。

shそう思いますdash

注:このコマンドは、他のシェルを確認すると異なる動作をします。

bosh、、、dashおよびmkshSolarisからバックスラッシュを印刷しますzshksh

bashkshLinuxでは、2つのバックスラッシュを印刷します。

$shell -x 出力を見ると、バックスラッシュが正しい出力だと思われます。

kshLinuxでなぜこれが機能するのかわかりません。行動を模倣しようとすることもできますbash

この動作の説明bashは、bashにPOSIX以外の実装があり、echoPOSIXが要求するようにバックスラッシュを解釈しないことです。

bashPOSIX は、小規模の組み込みシステムでのみ動作を許可します。それ以外の場合、POSIXではいわゆる拡張実装が必要です。XSIそのためには、AT&Tが1982年にSYSvに実装した動作に正確に従う必要がありますechoecho

重要なヒント:

次に始まるスクリプトがある場合

#!/bin/bash

呼び出すとxビットセットに応じて実行できます。chmod

sh myscript

/bin/shスクリプトはまだLinuxで実行されていますdash。したがって、コードの実行方法に注意してください。

問題を回避する方法があります。以下を使用するようにスクリプトを変更します。

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch

echoこれにより、1989年に発生した問題を回避できますbashprintfバグのある実装が多いため、すべての問題は解決されませんが、引数のバックスラッシュによって引き起こされる一般的な問題は影響を受けませんprintf

おすすめ記事