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

Bashスクリプトは、Bashシェル言語でスクリプトを作成しています。

2
ファイル名パターンまたはディレクトリのbash補完
bash完了スクリプトを設定しようとしていて、問題が発生しています。 リストされた補完が特定の拡張子に一致するファイル、またはディレクトリ(その拡張子のファイルを含む場合と含まない場合がある)のいずれかになるように設定したいと思います。 私が抱えている問題は、ファイルやディレクトリを含めるための補完を取得できる唯一の方法は、のようなものを使用することですが-o plusdirs -f -X '!*.txt'、bashにディレクトリの1つを補完させると、スペースではなくスペースが最後に追加されるだけですスラッシュ。 _xyz() { local cur=${COMP_WORDS[COMP_CWORD]} local prev=${COMP_WORDS[COMP_CWORD-1]} #COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -o dirnames …

1
同じスクリプトでコマンドを実行するためにbashスクリプトでユーザーIDを切り替え/変更するにはどうすればよいですか?
外部スクリプトを呼び出さずにいくつかのコマンドを実行してrootから他のコマンドの実行に戻るには、スクリプト内のユーザー識別情報(インストールプロセスの一部としてrootとして実行される)を切り替える方法はありますか? 並べ替え: #!/bin/bash some commands as root SWITCH_USER_TO user some commands as user including environment variables checks, without calling an external script SWITCH_USER_BACK some other stuff as root, maybe another user id change...

2
終了したサブコマンドにパイプするときに、bash whileループが終了しないのはなぜですか?
以下のコマンドが終了しないのはなぜですか?ループは終了するのではなく、無限に実行されます。 より複雑なセットアップを使用してこの動作を発見しましたが、コマンドの最も単純な形式は次のようになります。 終了しません: while /usr/bin/true ; do echo "ok" | cat ; done | exit 1 上記のタイプミスはありません。各「|」パイプです。「出口1」は、実行されて終了した別のプロセスを表します。 「exit 1」により、whileループ(リーダーのないパイプに書き込み)でSIGPIPEが発生し、ループが発生することが予想されます。しかし、ループは実行を続けます。 コマンドが停止しないのはなぜですか?


1
Google Chromeとの自動対話
よし、SU、クラックする楽しいナットがある。 私は8つのスクリーンを一列に並べて、すべてがSnow Leopardを実行する1つの頑丈なG5に接続しています(そうです、4つのグラフィックカード、幅は約15,000ピクセルです!)。全画面表示の8つのChromeブラウザーウィンドウを使用して、それぞれが異なるURLをポイントするデモを設定しています。コンピュータを再起動するたびに手動でこれを行うのはお尻の痛みです。 この設定を前提として、自動的にスクリプトを記述したいと思います。 特定の画面にChromeウィンドウを開く そのウィンドウを特定のURLにポイントする そのウィンドウの全画面(command-Fはキーボードショートカットです) 私はオートマトンを使用したことがなく、シェルスクリプトにもあまり慣れていませんが、群衆から派手な提案があるかどうか疑問に思っていました。 更新:高レベルの機能にAutomatorを使用する必要がある場合でも、最終的にはコマンドライン/スクリプトからスクリプトをトリガーする方法を期待しています。必要に応じて、このデモをシェルからリモートでオンにできるようにしたいと思います。

4
「ソース」を使用してスクリプトを実行するときに設定を適切に復元する方法は?
sourceそのタスクは環境を変更することなので、を使用して実行する必要があるスクリプトを書いています。スクリプトの実行中にset -eエラーが発生するとスクリプトが停止するようにしたいと思います。スクリプトは次のようになります。 #!/bin/bash set -e # do something cd somewhere source anotherScript 問題はset -e、スクリプトの終了後も自然に有効なままになることです。setスクリプトが停止したときに、変更されたオプションが以前の値に正しく復元されるようにするにはどうすればよいでしょうか(何らかの方法で-正常に完了するか、エラーで)。

2
スクリプトによって生成されたすべての子プロセスのリストを取得する方法
環境: ユーザーは、実行するカスタムスクリプトを提供します。これらのスクリプトは、複数のGUIプログラム、バックエンドサービスを開始するためのスクリプトに似たものにすることができます。スクリプトの記述方法を制御できません。これらのスクリプトはブロッキングタイプにすることができます。つまり、すべての子プロセス(順次実行されるプログラム)が終了するまで実行が待機します。 #exaple of blocking script echo "START" first_program second_program echo "DONE" または非ブロッキングタイプ、つまり、バックグラウンドで子プロセスをフォークし、次のようなものを終了するタイプ #example of non-blocking script echo "START" first_program & second_program & echo "DONE" 私は何を達成しようとしていますか? ユーザー提供のスクリプトは、上記の2つのタイプのいずれか、または両方の組み合わせにすることができます。私の仕事は、スクリプトを実行し、スクリプトによって開始されたすべてのプロセスが終了するまで待機してから、ノードをシャットダウンすることです。ブロッキングタイプの場合、ケースは非常に単純です。つまり、スクリプト実行プロセスのPIDを取得し、ps -ef | grep -ef PIDにエントリがなくなるまで待機します。非ブロッキングスクリプトは私に問題を与えるものです スクリプトの実行によって生成されたすべての子プロセスのPIDのリストを取得する方法はありますか?ポインタやヒントは高く評価されます

3
2つの子プロセスを連続して作成するには、どのコマンドを使用しますか?
2つの子プロセスを生成したいのですが、最初のプロセスがその実行の特定のポイント(標準出力を調べることで判断できます)に達するまで待ってから、2番目のプロセスを生成します。これを達成するのにどのUNIXコマンドが関係するのかはわかりませんが、UNIXコマンド名は簡潔で、時には暗号化されているため、Google経由で何かを見つけるのに苦労しました。 私は解決しようとしている特定の問題の解決策を求めていません(追加のポインターがあれば幸いです)、私は主に、どのUNIXコマンドを調べて使用するかを知ることに関心があります。

1
sedが一致しない行を省略する方法は?
次の例でsedは、aまたはで始まる行に一致し、cその行の最初の文字(aまたはc)を出力します。 $ echo "ag bh ci dj ek fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'. output: a bh c dj ek fl ただし、パターンと一致しない行も印刷されます。sedパターンに一致しない行を除外するにはどうすればよいですか?grep(以下のように)と組み合わせることで目的の効果を得るsedことができますが、「それだけ」で実現できるか知りたいです。 $ echo "ag bh ci dj ek fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/' output: a c

2
日付フォーマット%Y%m%dで日付スタンプ文字列を一貫して操作します
基本的に接頭辞付きの日付スタンプであるログファイルを作成する必要があります yp_ そして接尾辞 .logそして、操作された日数: $ touch yp_$(echo "$(date +%Y%m%d)-10" | /usr/bin/bc -l).log $ ls yp_20150912.log # ... ok for today's date. 今日はそれで問題ありませんが、1日の数が1日から10日の間に含まれていると、すべての地獄が解放されます。結果は日付スタンプとして解釈できなくなります。 例えば。その日が2016年3月8日、つまり '20160308'であることを想像してください。 どのように私は10日を差し引くことが生成されることを確認するために上記のコードを書くのですか? ではない '20150298'だが '20150227'? また19820103と年の答えをテストしてください... - 私は見た man date。 - apropos date 私もレビューした161ヒットを吐き出す。 誰かがそのワンライナーを手伝ってくれる?

2
bashの文字列変数に引用符を挿入します
文字列変数の最初と最後に引用符を挿入する方法はありますか? 私はこの変数を言っています: string="desktop/first folder" これをエコーすると、次のように表示されます: desktop/first folder 文字列を次のように保存する必要があります。 "desktop/first folder"


2
apt-getリクエストへのスクリプトの回答「続行するには、「はい、私が言うとおりに!」というフレーズを入力してください」
私のスクリプトは、debootstrapでdebianイメージを構築しながら、chroot内でsysvinitをsystemdに置き換えています。 これは「危険な」アクションなので、apt-getは馬鹿げた質問をします。「「はい、言ったとおりに!」というフレーズを入力し続けるには」 それに対する返信をスクリプト化するにはどうすればよいですか? 編集:-y --yes --force-yesオプションをすべて試しましたが、機能しません。


1
順序を変更せずに標準エラー出力を複製してbashで標準エラー出力とマージする
標準エラー出力と標準出力の両方をログファイルに書き出し、標準エラー出力を端末(またはデフォルトの出力デバイス)に出力します。 動機: 私は自分のcrontabにコマンドがあります、そして、私はその出力の全てをファイルに記録したいです、そして、エラー出力に書かれた何かがあれば私に電子メールを送りたいです。 私はこれらでいくらか成功しました: (echo out1; echo err1 1>&2; echo out2; echo err2 1>&2) \ 2> >(tee -a log) \ 1>>log または (echo err1 1>&2; echo out2; echo err2 1>&2) \ 3>&1 \ 1> >(tee -a log 1>/dev/null) \ 2> >(tee -a log 1>&3) またはexecで: exec 3>&1 exec 1> >(tee …

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