タグ付けされた質問 「shell-script」

シェルスクリプト、シェルによって解釈される実行可能ファイル(bash、zshなど)に関する質問。

3
awk:戻りステータスを強制しますか?
これは私の以前の質問のフォローアップです。 この便利なスニペットを使用して、/ etc / passwdのフィールド数を検証しています。次の例では、ユーザー「fieldcount1」と「fieldcount2」のフィールド数が間違っています。 $ awk -F: ' NF!=7 {print}' /etc/passwd fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash:::: fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash: $ echo $? 0 お気づきのとおり、awkは戻りステータス0で終了します。この観点からは、ここでは問題はありません。 このawkステートメントをシェルスクリプトに組み込みたいと思います。エラーであるすべての行を印刷し、戻りコードを1(エラー)に設定したいと思います。 特定の終了ステータスを強制しようとすることができますが、awkは1行のみを出力します。 $ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash:::: $ echo $? 1 awkを強制的に終了ステータス「1」で終了させ、一致するすべての行を印刷できますか?

4
すべてのユーザー名やホームディレクトリをリストするにはどうすればよいですか?
マシン上のすべてのユーザーを一覧表示したいのですが、通常は次のようにします: ls -l /home しかし、私は他のマシンに展開されるスクリプトでそれを使用します。おそらく、彼らはそれを自宅とは呼ばないマシン(例えばmyHome)にデプロイします。だから私はそれを一般化したいls -l ~。しかし、それはすべてのユーザーのホームディレクトリの名前ではなく、私のユーザーのホームディレクトリをリストするだけです(基本的にはマシン上のユーザー名のリストを取得したいです)。どのように一般化できますか?

3
どのシェルインタープリターがシバンなしでスクリプトを実行しますか?
アカウントのデフォルトのシェルがzshであるが、ターミナルを開いてbashを起動し、という名前のスクリプトを実行したとしますprac002.sh。どのシェルインタープリターを使用して、スクリプト、zshまたはbashを実行しますか?次の例を考えてみましょう。 papagolf@Sierra ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf [sudo] password for papagolf: papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh # papagolf's default shell is zsh papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash # I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.) papagolf@Sierra:~/My Files/My Programs/Learning/Shell$ ./prac002.sh …

6
スクリプトの開始後にインタープリターを選択します(例:hashbang内のif / else)
スクリプトを実行しているインタープリターを動的に選択する方法はありますか?2つの異なるシステムで実行しているスクリプトがあり、使用したいインタープリターは2つのシステムの異なる場所にあります。最終的に私がしなければならないのは、切り替えるたびにハッシュバングの行を変更することです。私はこれと論理的に同等の何かをしたいと思います(この正確な構成は不可能であると認識しています): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here または、最初のインタープリターを使用しようとし、見つからない場合は2番目のインタープリターを使用するように、これがさらに良いでしょう。 try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here 明らかに、私は代わりに、/path/to/python/on/systemA myscript.py または /path/on/systemB myscript.py 現在の場所に応じて実行でき ますが、実際にはを起動するラッパースクリプトがmyscript.pyあるため、手作業ではなくプログラムでpythonインタープリターへのパスを指定したいと思います。

1
ギャップを残しながら、音声ファイルから無音を削除します
現在、シェルファイル内でこのコマンドを使用して、オーディオファイルから無音部分を削除しています。 ffmpeg -i $INFILE -af silenceremove=0:0:0:-1:1:${NOISE_TOLERANCE}dB -ac 1 $SILENCED_FILE -y これは、すべての無音を削除し、残りのオーディオを一緒に圧縮することを除いて、正常に機能します。 各オーディオの間に2〜3秒を残して、これをどのように行うことができますか 多くのオーディオを処理するため、ソリューションは非常に効率的である必要があり、ffmpegやsoxなど、LinuxとOSXの両方に簡単にインストールできるツールを使用する必要があります。

1
これらのbash fork爆弾の動作が異なるのはなぜですか。
通常のフォーク爆弾がどのように機能するかはわかりますが、一般的なbashフォーク爆弾の最後に&が必要な理由と、これらのスクリプトの動作が異なる理由はよくわかりません。 :(){ (:) | (:) }; : そして :(){ : | :& }; : 前者は、ログイン画面に戻る前にCPU使用率の急上昇を引き起こします。後者は代わりにシステムをフリーズさせ、ハードリブートを強制します。何故ですか?どちらも継続的に新しいプロセスを作成しますが、なぜシステムの動作が異なるのですか? また、両方のスクリプトは、 :(){ : | : }; : 似ていると思っていたとしても、問題はまったく発生しません。bashのマニュアルページには、パイプラインのコマンドはすでにサブシェルで実行されていると記載されているため、次のように信じられます。:すでに十分です。私は信じており、新しいサブシェルでパイプラインを実行する必要がありますが、なぜそんなに変わるのですか? 編集:htopを使用してプロセスの量を制限すると、最初のバリアントはプロセスの実際のツリーを作成し、2番目のバリアントは同じレベルのすべてのプロセスを作成し、最後のバリアントはプロセスを作成しないように見えましたまったく。これは私をさらに混乱させますが、おそらくそれが何らかの形で役立つのでしょうか?

5
多数の大きなファイルを高速で圧縮する
毎日約200 GBのログデータが生成され、約150の異なるログファイルに分散されています。 ファイルを一時的な場所に移動し、一時ディレクトリでtar-bz2を実行するスクリプトがあります。 200 GBのログは約12〜15 GBに圧縮されているため、良い結果が得られます。 問題は、ファイルの圧縮に永遠に時間がかかることです。cronジョブは、毎日午前2時30分AMに実行され、5まで実行し続けます:00-6:00 PMを。 圧縮の速度を改善し、ジョブをより速く完了する方法はありますか?何か案は? 他のプロセスとすべての心配しないで、圧縮が起こる場所は、上にあるNAS、そして私は、専用のNASマウント実行することができVMをし、そこから圧縮スクリプトを実行します。 参照用のtopの出力は次のとおりです。 top - 15:53:50 up 1093 days, 6:36, 1 user, load average: 1.00, 1.05, 1.07 Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie Cpu(s): 25.1%us, 0.7%sy, 0.0%ni, 74.1%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st Mem: 8388608k total, 8334844k used, …

5
これはbashのバグですか?`return`はパイプから呼び出されても関数を終了しません
私は最近bashでいくつかの奇妙な問題を抱えています。スクリプトを簡素化しようとしている間に、この小さなコードを思いつきました。 $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 return印刷せずに関数を終了する$?必要がありますか?それでは、パイプから単独で戻ることができるかどうかを確認しました。 $ echo | while read -r; do return 1; done bash: return: can only `return' from a function …

4
異なるファイルの2つの列を比較し、一致する場合に出力する
Solaris 10を使用しているため、-fを含むgrepオプションは機能しません。 パイプで区切られた2つのファイルがあります。 file1: abc|123|BNY|apple| cab|234|cyx|orange| def|kumar|pki|bird| ファイル2: abc|123| kumar|pki| cab|234 file2の最初の2列をfile1と比較したい(最初の2列でfile1の内容全体を検索する)場合、file1の一致する行を印刷します。次に、ファイル2の2行目などを検索します。 期待される出力: abc|123|BNY|apple| cab|234|cyx|orange| 私が持っているファイルは巨大で、約400,000行を含んでいるので、実行を速くしたいと思います。

4
キーがすでに存在する場合は、ssh-addを静かにします
ssh-add /path/to/special_keyスクリプトの先頭に置きたいです。これは正常に機能しますが、常にパスフレーズの入力を求められます。これは奇妙でありssh-add -l、キーが既に追加されていることを示す場合でもパスフレーズを要求するため、少し面倒です。 それを伝える方法はありますか:「このキーを追加し、パスフレーズがまだ追加されていない場合は尋ね、そうでなければ何もしません」?

5
ステートフルbash関数
呼び出しごとにカウントを増やす(そして返す)Bashの関数を実装したいと思います。残念ながら、サブシェル内で関数を呼び出しているため、親シェルの変数を変更できないため、これは簡単ではないようです。 これが私の試みです: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } これは次のように使用されます(したがって、サブシェルから関数を呼び出す必要があります)。 PS1='$(ps_count_reset)> ' PS2='$(ps_count_inc) ' そうすれば、番号が付いた複数行のプロンプトが表示されます。 > echo 'this 1 is 2 a 3 test' 可愛い。しかし、上記の制限のために機能しません。 機能しない解決策は、変数ではなくファイルにカウントを書き込むことです。ただし、これにより、同時に実行される複数のセッション間で競合が発生します。もちろん、シェルのプロセスIDをファイル名に追加することもできます。しかし、多くのファイルでシステムが乱雑にならないより良い解決策があることを願っています。

4
Bash:インタラクティブなリモートプロンプト
リモートサーバーに接続し、パッケージがインストールされているかどうかを確認するスクリプトがあります。 ssh root@server 'bash -s' < myscript.sh myscript.sh: OUT=`rpm -qa | grep ntpdate` if [ "$OUT" != "" ] ; then echo "ntpdate already installed" else yum install $1 fi この例は単純化できます。myscript2.shこれには同じ問題があります: read -p "Package is not installed. Do you want to install it (y/n)?" choise 私の問題は、bashが私の答えをインタラクティブに読むことができないことです。 ユーザーにプロンプ​​トを表示する機能を失うことなく、ローカルスクリプトをリモートで実行する方法はありますか?
16 bash  shell-script  ssh  stdin  read 

3
バックグラウンドで実行されているbashシェルスクリプトを終了する
多くの場合、bashシェルスクリプトを使用して、さまざまなファイルに対して簡単なコマンドを実行します。例えば、私は次があるとbash呼ばれるシェルスクリプト、script.shプログラム/コマンドを実行し、foo3つのテキストファイルには"a.txt"、"b.txt"、"c.txt": #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done また、それfoo $strname".txt"が遅いと仮定すると、スクリプトの実行には長い時間がかかります(たとえば、数時間または数日)。このためnohup、端末が閉じられたり切断されたりしても実行が継続されるように使用したいと思います。また、スクリプトをすぐにバックグラウンドに移動させたいので、&演算子を使用します。したがって、次のコマンドを使用して呼び出しますscript.sh。 nohup bash script.sh & これは、スクリプトをバックグラウンドでハングアップせずに実行する場合には正常に機能しますが、何らかの理由である時点で実行を終了したいとします。これどうやってするの? 私が遭遇した問題は、を見るとtop、にfoo対応するものだけが見えること"a.txt"です。そのfoo呼び出しを終了することはできますが、foo対応する"b.txt"が呼び出されると、その呼び出しも終了する必要があります。forループで指定された数十または数百のテキストファイルの場合、すべてfooを1つずつ終了するのは面倒です!そのため、代わりにシェルスクリプトから発行された特定の呼び出しではなく、シェルスクリプト自体を代わりに終了する必要があります。 コマンドを入力するとき ps -u myusername myusernameユーザー名はどこにあるのか、実行中のプロセスのリストを取得します。しかし、という2つの異なるプロセスIDが表示されbashます。これらのプロセスがあれば、どのプロセスが元の呼び出しに対応しているかを知るにはどうすればよいnohup bash script.sh &ですか?


4
堅牢なパスの構築
シェルスクリプト(zshなど)にいくつかの変数があるとします。 FOLDER_1, FOLDER_2, etc. これらの変数は、から派生するフォルダーを参照します/。たとえば、パスがある場合/home/me/stuff/items 変数は次のとおりです。 FOLDER_1='home' FOLDER_2='me' FOLDER_3='stuff' ここで、変数を連結して対応するパスを構築し直したいとします。可能な方法の1つは、次のようにパスを作成することです。 PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/ ただし、変数の中にはFOLDER_iスラッシュが付いているものもあれば、付いていないものもあると言う(そして、どれがわからないのか) FOLDER_1='home' FOLDER_2='stuff/' FOLDER_3='items' 私の質問は次のとおりです。どうすればパスを堅牢に構築できますか?(たとえば、二重スラッシュを避け、必要な場所に追加します)。 これを行う1つの方法は/、変数のペア間に常に追加し、で重複を削除することsedだと思いましたが、それを動作させることはできません(私はで/正しく処理しているかわかりませんsed)。 また、私は車輪を再発明していますか?(つまり、すでにこれを行う組み込み機能はありますか?)。 最後に、変数が配列内にある場合、たとえばFOLDERS、ループせずにこれを行うことは可能ですか?(または、ループFOLDERS内にあるが、配列内にいくつあるかを知らずに)。

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