タグ付けされた質問 「bash-completion」

2
bash補完のコンテキストでの$ {array [*]}と$ {array [@]}に関する混乱
私は初めてbashの補完を書くことに挑戦していますが、bash配列(${array[@]}と${array[*]})を逆参照する2つの方法について少し混乱しています。 これが関連するコードのチャンクです(ちなみに、それは機能しますが、もっとよく理解したいと思います): _switch() { local cur perls local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew} COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} perls=($ROOT/perls/perl-*) # remove all but the final part of the name perls=(${perls[*]##*/}) COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) ) } bashのドキュメントによると: 配列の任意の要素は、$ {name [subscript]}を使用して参照できます。中括弧は、シェルのファイル名展開演算子との競合を避けるために必要です。下付き文字が「@」または「*」の場合、単語は配列名のすべてのメンバーに展開されます。これらの添え字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合、$ {name [*]}は各配列メンバーの値がIFS変数の最初の文字で区切られた単一の単語に展開され、$ {name [@]}は名前の各要素を展開します別の言葉に。 これでcompgen -W、可能な代替の単語リストを含む文字列が必要であることは理解できたと思いますが、このコンテキストでは、「$ {name [@]}が名前の各要素を個別の単語に展開する」とはどういう意味かわかりません。 短編小説:${array[*]}作品; ${array[@]}そうではありません。その理由を知りたいのですが、正確に何が${array[@]}拡大するのかをよりよく理解したいと思います。

8
ジョブIDとプロセスIDを出力せずにバックグラウンドでbashコマンドを実行する
bashでバックグラウンドでプロセスを実行するのはかなり簡単です。 $ echo "Hello I'm a background task" & [1] 2076 Hello I'm a background task [1]+ Done echo "Hello I'm a background task" ただし、出力は冗長です。最初の行には、バックグラウンドタスクのジョブIDとプロセスIDが出力され、次にコマンドの出力が表示され、最後にジョブID、そのステータス、およびジョブをトリガーしたコマンドが表示されます。 バックグラウンドタスクの実行の出力を抑制して、出力が最後にアンパサンドがない場合とまったく同じように見えるようにする方法はありますか?すなわち: $ echo "Hello I'm a background task" & Hello I'm a background task 私が尋ねる理由は、タブ補完コマンドの一部としてバックグラウンドプロセスを実行したいので、そのコマンドの出力が意味をなさないようにする必要があるためです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.