コマンド置換を実行すると表示されないのはなぜですか?

コマンド置換を実行すると表示されないのはなぜですか?

cd親プロセスで使用されるパスを返す対話型スクリプトがあります。このように:

$ cd $(myscript)

スクリプトの実行中に使用したいと思いますless。残念ながら、コマンドの置換中に を使用することはうまくlessいかないようです。

$ echo $(less <<< 'some text') # Not working
some text

だから私の質問は:なぜ動作しないのですか?解決策はありますか?

スクリプトの実行中に対話型ヘルプ画面を表示しようとしています。このスクリプトをコマンド置換に入れる必要があります。これは、親プロセスで作成されたパスにCDを移動する唯一の方法であるためです。より良い方法があるかもしれませんが、これが最善の選択です。

ベストアンサー1

echo $(somecmd)通常、すべてのsomecmd.の場合、出力はsomecmdの引数に展開され、その引数を取得echoechoて出力に印刷します。通常は直接実行できますsomecmd

ワードセパレータとワイルドカードの2つの違いは一般的です。echo $(somecmd)スペースを圧縮し、ファイル名glob()のように見えるすべての項目を展開します*.txt。しかし、もちろん、これは単に実行するかsomecmd引用echo "$(somecmd)"符で実行するときには発生しません。それ最後の改行文字を除くすべての項目を削除します。拡張バックスラッシュをエスケープするechoこともできます。

lessの目的は次のとおりです。インタラクティブファイルを参照するか、端末がほとんど必要なパイプ入力を実行します。コマンド置換で実行すると、 の出力がlessパイプに接続され、その動作が . cat(マンページで正確な動作に関する言及が見つからないようです)


これで、コマンドオーバーライドで実行され、ユーザーがいくつかの出力を参照できるようにし、コマンド置換で別のテキストを返すスクリプトが必要な場合は、リダイレクトをクリエイティブに使用できるようになります(mosvyの説明)。

$ cat myscript
#!/bin/bash
echo this is the output

cat >&2 <<EOF
you can
browse this
with less
EOF
$ foo=$( ./myscript 2> >(less > /dev/tty))

スクリプトの標準出力はコマンドオーバーライドに移動し、エラー出力はに設定されるために設定さlessfooますthis is the outputfoo少なくともless

さらに、これらの実行はlessジョブ制御を混乱させるので、実行中にCtrl-Cを押すと奇妙な動作が発生する可能性があります。


ここでは一時ファイルを使用することをお勧めします。結果をパラメータ(たとえば)myscriptというファイルに書き込み、次のコマンドを実行します。echo "$result" > "$1"

tmp=$(mktemp)
myscript "$tmp"
cd "$(cat "$tmp")"
rm "$tmp"

あるいは、他の対話型プログラムをmyscript一般的な方法で起動することができ、タスクless制御に問題がないはずです。

おすすめ記事