Bash 組み込み機能の複数行出力キャプチャ

Bash 組み込み機能の複数行出力キャプチャ

通常、bashはコマンドの出力を複数行にわたって配布できます。

L=`ls`

これは対話型シェルとスクリプトで機能します。しかし、組み込み関数の出力を変数としてキャプチャできないようです。

L=`dirs -l -p`

これは対話型シェルで機能しますが、スクリプトでは最初の行だけが変数で終わります。それはおそらくbashの組み込み関数の処理方法が異なるからです。

なぜこれが起こり、必要なタスクをどのように実行できますか?

ベストアンサー1

質問した内容に多少曖昧な部分があるようです。あなたは言う:

しかし、スクリプトでは最初の行だけが変数で終わります。

それからあなたのコメントは、スクリプトではなくシェル関数を書いていることを示しています。

cd私はスクリプトのどれも親シェルに伝播されないので、ディレクトリを変更するのにスクリプトが役に立たないことを知っていると思います。スクリプトでディレクトリ変更プログラムを開発しようとすると、ディレクトリスタックは次のようになるため、困難に陥ります。いいえスレーブシェルから継承されます。

$ dirs -l
/home/msw /home/msw/Ubuntu One /home/msw /usr/bin /usr/local /bin /usr/local
$ cat > dirs.sh
dirs -l 
$ bash dirs.sh
/home/msw

役に立つ機能を得ることができます:

$ function passdirs() { bash ndirs.sh `dirs -l -p`; }
$ cat > ndirs.sh
echo $#
echo "$@"
$ passdirs
8
/home/msw /usr/local /usr/bin /bin /usr/local /usr/bin /bin /home/msw

しかし、もちろん、cd現在のシェル内で動作するには関数が必要です。この場合、コマンドラインを介して引数をラップしてアンラップすることは引用符を引用解除することです。

$ function cd_pattern() {
   cd $(dirs -l -p | grep --max-count=1 -e "$1") ; dirs
}
$ dirs
~ /usr/local /bin /usr/share/doc/evince ~/Ubuntu One
$ cd_pattern v..c
/usr/share/doc/evince /usr/local /bin /usr/share/doc/evince ~/Ubuntu One

$(...)引用の混乱を減らすために、逆引用符の同義語としても使用されます。

おすすめ記事