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

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

2
履歴の最後のコマンドから2番目の引数にアクセスする方法は?
私はいくつかの正規表現を学び始めているので、このコマンドを繰り返し使用します: grep pattern /usr/share/dict/american-english パターンが変わる部分だけなので、長い式「/ usr / share / dict / american-english」を何度も書く必要があります。 誰かが、完全な式の代わりに不可解な文字の組み合わせを入力することにより、コマンド履歴からコマンドの引数を展開することが可能であると発言しました。これらの不可解な文字の組み合わせを教えてください。

4
スクリプトの実行にかかる時間を測定し、それを生成するメールに含めるにはどうすればよいですか?
私は一連のチェック(走る、簡単なbashスクリプト持っているping、nslookupなど)をし、そのデータの出力と電子メールレポートを送信します。 スクリプト全体の実行にかかった時間に関する情報をメールに含めたいです。その情報を収集する簡単な方法はありますか?


4
レガシーのDebianバージョンとBash Shellshock
このショップではアップグレードを行ったことがないため、Debian Etch、Lenny、Squeezeを実行しています。さまざまなDebianバージョンを実行する150以上のシステムがあります。今週の「シェルショック」を踏まえると、bashをアップグレードする必要があると思います。Debianを知らないので心配です。 apt-get install bash自分のリポジトリがSqueezeエントリをポイントしているときに、すべてのDebianシステムで実行して正しいBashパッケージを取得できますか?そうでない場合、他にどのような行動方針がありますか?

2
括弧はbashシェル自体では機能しますが、bashスクリプトでは機能しません
このコマンドは、コマンドラインプロンプトから実行できます。 cp -r folder/!(exclude-me) ./ 現在のディレクトリに指定されたサブディレクトリをfolder 除くすべての内容を再帰的にコピーしますexclude-me。これは意図したとおりに機能します。しかし、私が書いたbashスクリプトで作業するには、これが必要です。 if [ -d "folder" ]; then cp -r folder/!(exclude-me) ./ rm -rf folder fi しかし、スクリプトを実行すると: bash my-script.sh 私はこれを手に入れます: my-script.sh: line 30: syntax error near unexpected token `(' my-script.sh: line 30: ` cp -r folder/!(exclude-me) ./' コマンドプロンプトから機能する理由がわかりませんが、bashスクリプトではまったく同じ行が機能しません。

6
2つのファイルの違いを出力するにはどうすればよいですか?
私のファイルは以下で構成されています。おおよそ: username:username:username:username:username 上記の行は約600文字まで続きます。 awkコマンドラインから送信されたAPI / HTTPリクエストの引数として使用するために、コマンドを使用します。 私のスクリプトを使用して、「フォロー」しているユーザーアカウントのリストを取得し、24時間ごとに、ハードディスクの元のリストと新しく出力されたユーザー名のリストを比較します(そして、フォローしていないユーザーをエコーします)私。bashを使用してロジックをループにカプセル化する必要があります。各ユーザー名をテストします。 私の現在のスクリプト: user=$(awk -F: '{ print $1 }' FILE) # Grab $User to use as an argument. following=$(exec CURRENT_FOLLOWERS) # Outputs the new file echo "X amount of users are following you on 78B066B87AF16A412556458AC85EFEF66155" SAVE CURRENT FOLLOWERS TO NEW A FILE. if [[ DIFFERENCE …

4
現在実行中のbashスクリプトがデバッグのために-xで呼び出されたかどうかを確認するにはどうすればよいですか?
launch.sh正しい所有者でファイルを作成するために、別のユーザーとして自分自身を実行するスクリプトがあります。最初にスクリプトに渡された場合、この呼び出しに-xを渡したい if [ `whoami` == "deployuser" ]; then ... bunch of commands that need files to be created as deployuser else echo "Respawning myself as the deployment user... #Inception" echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->" sudo -u deployuser -H bash $0 "$@" # How to pass -x here if it …
11 bash  debugging 

3
1回のパスで複数の文字列を置き換える
テンプレートファイルのプレースホルダー文字列を、一般的なUnixツール(bash、sed、awk、perlなど)で具体的な値に置き換える方法を探しています。交換が1回のパスで行われることが重要です。つまり、すでにスキャン/交換されたものを別の交換と見なしてはなりません。たとえば、次の2つの試みは失敗します。 echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA この場合の正しい結果はもちろんBAです。 一般に、ソリューションは、入力を左から右にスキャンして、指定された置換文字列の1つとの最長一致を検索し、各一致について置換を実行して、入力のそのポイントから続行することと同等でなければなりません(すでに読み込まれた入力も、実行された置換も一致と見なされます)。実際、詳細は関係ありません。置換の結果が全体または一部が別の置換の対象になることはありません。 注私は正しい一般的なソリューションのみを探しています。特定の入力(入力ファイル、検索および置換ペア)で失敗するソリューションを提案しないでください。
11 bash  sed  awk  string  replace 

2
$ BASH_COMMANDを評価しても安全ですか?
私は変数から複雑なコマンドを構築するシェルスクリプトに取り組んでいます。たとえば、次のようにします(Bash FAQから学んだテクニックを使用)。 #!/bin/bash SOME_ARG="abc" ANOTHER_ARG="def" some_complex_command \ ${SOME_ARG:+--do-something "$SOME_ARG"} \ ${ANOTHER_ARG:+--with "$ANOTHER_ARG"} このスクリプトはパラメーター--do-something "$SOME_ARG"を動的に追加--with "$ANOTHER_ARG"しsome_complex_command、これらの変数が定義されているかどうかを確認します。これまでのところ、これは正常に動作しています。 しかし、コマンドを実行しているとき(たとえば、スクリプトがデバッグモードで実行されているとき)に、コマンドを印刷またはログに記録できるようにしたいと思っています。そのため、スクリプトを実行するときに、some_complex_command --do-something abc --with defこのコマンドを変数に含めて、syslogに記録できるようにしたいと考えています。 Bash FAQは、この目的でトラップと変数(たとえば、デバッグ目的)を使用DEBUG$BASH_COMMANDする手法を示しています。私は次のコードでそれを試しました: #!/bin/bash ARG="test string" trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG echo "$ARG" echo "Command was: ${COMMAND}" これは機能しますが、コマンドの変数は展開されません。 host ~ # ./test.sh test string Command was: echo "$ARG" 展開echo "$ARG"するにはevalを使用する必要があると思いますecho …
11 bash 


2
カスタムbash関数とエイリアスを文書化する方法は?
問題: 複数のbash関数とエイリアスがあります。頭の上にあるものすべてを覚えているわけではないので、たいていの場合.bash_functions、.bash_aliasesファイルを開いて必要なものを見つけます。 質問: bashプロンプトから使用できる関数/エイリアスを一覧表示するにはどうすればよいですか? コメント(PHPDocのようなもの)を使用してbash関数/エイリアスを文書化することは可能ですか? ファイルを開かずに、利用できるものを出力する簡単で便利な方法が欲しいのですが。コマンドを実行して、関数/エイリアスの動的リストを吐き出させると便利です(使用例はプラスです)。:)

2
すべてのディレクトリで使用できるシンボリックリンクを定義する方法
たとえばproject、ディレクトリをポイントするために使用できるようにシンボリックリンクを設定することは可能home/me/projectですか?これは、ファイルシステム内の場所とは無関係である必要があります。 私のようなコマンドを使用したいのですがcd project、nano project/file1.texなどを。 すべてのディレクトリへのシンボリックリンクを記述する必要がありますか?
11 bash  symlink 

3
Bashユーザーからのはい/いいえ応答の処理
これは私の愚かさかもしれません。はい/いいえ、真/偽の応答をBashスクリプト内で受け入れたい: test.sh #!/bin/bash ARGUMENT=$1 echo User passed in $ARGUMENT OPTARG=${ARGUMENT:0:1} if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then echo Decline elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then echo Accept else echo Invalid argument fi 以下にいくつかのサンプル結果を示します。 ./test.sh 0 User passed …
11 bash 

6
半非同期パイプ
次のパイプがあると仮定します。 a | b | c | d cまたはで(またはb)の完了を待つにはどうすればshよいbashですか?つまり、スクリプトdはいつでも開始できますが(待機する必要はありません)、からの完全な出力がc正しく機能する必要があります。 ユースケースは、画像を比較するdifftoolためのgitものです。これは呼び出されgit、その入力(a | b | cパート)を処理して、比較の結果(パート)を表示する必要がありますd。呼び出し元は、aおよびに必要な入力を削除しますb。つまり、スクリプトから戻る前に、プロセスc(またはb)を終了する必要があります。一方、dユーザーの入力を待っているので、待つことができません。 結果をc一時ファイルに書き込んだり、FIFOをで使用したりできることはわかっていますbash。(ただし、FIFOが役立つかどうかはわかりません。)一時ファイルなしでこれを実現することは可能shですか? 編集 おそらく、信頼できる方法でc(またはb)プロセスのプロセスIDを見つけることができれば十分でしょう。次に、パイプ全体を非同期で開始し、プロセスIDを待つことができます。の線に沿った何か wait $(a | b | { c & [print PID of c] ; } | d) 編集^ 2 私は解決策を見つけました、コメント(またはより良い解決策)は大歓迎です。
11 bash  shell  pipe  fifo 

1
スクロールスペースを節約するために、bashの古いプロンプト行をクリアします
私の端末のテーマは以前はこんな感じでした しかし、私はプロンプトがあまりにも多くのスペースを無駄にしたと思いました。そして、後で、コマンドを実行するたびにプロンプ​​トをクリーンアップできるというアイデアを得ました。私はbashを使用していましたが、解決策の1つはpreexec_invoke_exec関数を使用することです。 次のコマンドを使用して、最後のプロンプト文字を消去します。 echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m" このようにターミナルがとてもきれいになるように しかし今私の問題は、たとえばを使用するときに、1行で複数のコマンドを使用する場合に問題が発生することですfor i in ...。 これが私の.bashrcの関数の完全版です。 preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne " \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" …
11 bash  shell  terminal  prompt 

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