cd
親プロセスで使用されるパスを返す対話型スクリプトがあります。このように:
$ cd $(myscript)
スクリプトの実行中に使用したいと思いますless
。残念ながら、コマンドの置換中に を使用することはうまくless
いかないようです。
$ echo $(less <<< 'some text') # Not working
some text
だから私の質問は:なぜ動作しないのですか?解決策はありますか?
スクリプトの実行中に対話型ヘルプ画面を表示しようとしています。このスクリプトをコマンド置換に入れる必要があります。これは、親プロセスで作成されたパスにCDを移動する唯一の方法であるためです。より良い方法があるかもしれませんが、これが最善の選択です。
ベストアンサー1
echo $(somecmd)
通常、すべてのsomecmd
.の場合、出力はsomecmd
の引数に展開され、その引数を取得echo
しecho
て出力に印刷します。通常は直接実行できます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))
スクリプトの標準出力はコマンドオーバーライドに移動し、エラー出力はに設定されるために設定さless
れfoo
ますthis is the output
。foo
少なくともless
。
さらに、これらの実行はless
ジョブ制御を混乱させるので、実行中にCtrl-Cを押すと奇妙な動作が発生する可能性があります。
ここでは一時ファイルを使用することをお勧めします。結果をパラメータ(たとえば)myscript
というファイルに書き込み、次のコマンドを実行します。echo "$result" > "$1"
tmp=$(mktemp)
myscript "$tmp"
cd "$(cat "$tmp")"
rm "$tmp"
あるいは、他の対話型プログラムをmyscript
一般的な方法で起動することができ、タスクless
制御に問題がないはずです。