次のような長いコマンドでいくつかのスクリプトを設定したいと思います。
{ somecheck || somecomand "reallyreallyreallyreallyreallyreallylongstring" } &> /dev/null &
次のようになります。
{ somecheck || \
somecomand "reallyreally" \
"reallyreally" \
"reallyreally" \
"longstring" \
} &> /dev/null &
でも噴射が心配です。これを避けるために、以下を検討しています。
{ somecheck || \
somecomand "$(echo \
"reallyreally" \
"reallyreally" \
"reallyreally" \
"longstring" \
)" \
} &> /dev/null &
bash / zshで複数行文字列を実行する別の方法を知っている人はいますか?この情報の取得に問題があります。少なくとも3つのプロセス(スクリプト、背景ブロック、およびコマンド代替サブシェル)を意味するようです。より良い方法がありますか?
よろしくお願いします!
答え1
このように行連続を使用すると、文字列にスペースが追加されます。シーケンスはbackslash-newline-whitespace
単一のスペースで置き換えられます。
変数を使用するだけでも可読性が大幅に向上します。
url="reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongstring"
{ somecheck || somecomand "$url" } &> /dev/null &
それでも配列を使用して部分文字列に分割できます。
parts=(
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"reallyreallyreallyreally"
"longstring"
)
whole=$(IFS=; echo "${parts[*]}")
しかし、追加された複雑さを考えると、リテラル文字列を分割することは本当に重要ですか?
答え2
まあ、少し簡単にすることができます:
$ [ -f /dev/null ] || sed 's/a/A/g' <(echo "thisis""avery"\
"long""string"\
"Ihave""separated"\
"into""smaller"\
"substrings")
thisisAverylongstringIhAvesepArAtedintosmAllersubstrings
重要なことは、入力文字列に余分なスペースがあってはならないということです\
。
変数の使用に関するGlennのアドバイスは素晴らしくシンプルです。そのままにしてください。
答え3
私はGlennの2つの提案の間のどこかにアプローチを提案します。つまり、(単純なスカラー)変数を使用しますが、定義を複数行に分割します。
myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ali"
myword="${myword}docious"