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

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

3
関数内からメールコマンドを実行すると、「フォーク爆弾」が発生します。
mailbashスクリプトの関数内から実行しようとすると、フォーク爆弾のようなものが作成されます。明確にするために、これは問題を作成します: #!/bin/bash mail() { echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org" } mail exit 0 場合によっては、コマンドを強制終了するだけで子プロセスを強制終了することもありますが、強制する必要がある場合もありますkillall -9。 メールが送信されたかどうかは関係ありません。フォーク爆弾は、いずれかの方法で作成されます。そして、のような終了コードのチェックを追加することは役に立たないようですif ! [ "$?" = 0 ]。 ただし、以下のスクリプトは意図したとおりに機能し、エラーを出力するか、メールを送信します。 #!/bin/bash echo "Free of oxens" | mail -s "Do you want to play chicken with …

3
3つの単一引用符の間のテキストを抽出する
次のファイルを持っています description: ''' This rule forbids throwing string literals or interpolations. While JavaScript (and CoffeeScript by extension) allow any expression to be thrown, it is best to only throw <a href="https://developer.mozilla.org /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects, because they contain valuable debugging information like the stack trace. Because of JavaScript's dynamic nature, CoffeeLint …

1
引用符付きのbashスクリプト解析引数
testという名前のこの単純なスクリプトを検討してください。 #!/bin/bash echo $1 次のコマンドと呼び出し: $ echo "A B" A B $ echo ""A B"" A B $ echo """A B""" A B $ echo """A B""" A B $ ./test "A B" A B $ ./test ""A B"" A $ ./test """A B""" A B $ ./test """"A B"""" …

3
暗号化された(GPG)ファイルをオンザフライでスクリプトで調達する方法はありますか?
入手するファイルには機密情報が含まれているため、暗号化されたファイルを入手するにはbashスクリプトが必要です。 スクリプトでGPGパスフレーズの入力を求めてから実行し、暗号化されたファイルを取得します。これを行う方法はわかりません。暗号化されたファイルと共にサーバーにキーを保存したくないので、パスフレーズのユーザー入力が必要です。 いくつかの異なる方法を検討していますが、ファイルを復号化せずに、暗号化されていないファイルを取得し、後で削除します。スクリプトに問題が発生した場合に、暗号化されていないファイルが残る可能性を減らしたいと思います。 この方法でそれを調達するファイルのGPG出力を取得する方法はありますか?STDOUTを収集して解析する可能性があります(GPGがコンテンツをこのように出力できる場合)。 また、シェルスクリプトが使用できるファイルを暗号化する別の方法がある場合、私はそれを認識していませんが、他の可能性を開いています。

5
プログラムでawkフレーバーを検出する方法(gawkとnawkなど)
私は基本的にbashシェルスクリプトのコレクションであるコマンドラインアプリケーションを使用しています。アプリケーションは、BSD / OSXおよびLinuxで実行するように作成されました。スクリプトの1つはawkに依存しています。これには2つのawkコマンドが含まれています。1つはnawk(標準のBSD awk実装)用に記述され、もう1つはgawk(GNU awk実装)用に記述されています。 問題の2つのawkコマンドは、異なる環境との互換性がありません。特に、gawkで実行するとnawkコマンドが失敗します。スクリプトは、uname -sホスト環境を判別するためにカーネル名(つまり)をチェックし、適切なawkコマンドを実行します。ただし、GNUコアユーティリティがインストールされたMac OS Xで作業することを好むため、スクリプトは正しく実行されません。 このバグを修正する最善の方法を考える過程で、できれば比較的堅牢で移植性のある方法で、一般的なコマンドラインユーティリティの異なるフレーバーをプログラムで区別する方法を知っておくとよいと思いました。 nawkがバージョン情報を出力するための「-V」フラグを受け入れないことに気付いたので、次のようなものが機能するはずだと考えました。 awk -V &>/dev/null && echo gawk || echo nawk 別のバリエーションは次のとおりです。 awk -Wversion &>/dev/null && echo gawk || echo nawk これは私の2つのテスト環境(OS XとCentOS)で動作するようです。ここに私の質問があります: これは最善の方法ですか? これを拡張してawkの他のバリエーション(例:mawk、jawkなど)を処理する方法はありますか? awkの他のバージョンについても心配する価値がありますか? また、私はawkについてほとんど知らないことも述べておきます。

3
awkは終了しません
というファイルに次のコードがありますawktest1.awk。 #!/bin/awk -f BEGIN{print "start"} {print $2, "\t", $5} END{print "end"} employee.txt にemployee.txtは次のデータが含まれます。 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000 次のようにawkコマンドを実行します。 awk -f awktest1.awk しかし、印刷startして終了するだけではありません。誰かが私がここで間違っていることを手伝ってくれる?

1
[“ $ VAR” =“”]と[-z“ $ VAR”]は常に同等ですか?
私のコードは次のようになります: VAR="" while [ -z "$VAR" ]; do VAR=$( command | grep "important_string" ) done の出力をポーリングしてcommand、important_stringが表示されてに入れられるようにし$VARます。 との間に機能的な違いは[ -z "$VAR" ]あり[ "$VAR" = "" ]ますか?

6
テスト後に最後の終了ステータスを維持する方法
$?テスト後に最後のコマンドの終了ステータス()を変更しないでおくことは可能ですか? 例えば、私はしたいと思います: command -p sudo ... [ $? -ne 1 ] && exit $? 最後exit $?はsudo終了ステータスを返す必要がありますが、代わりに常に0(テストの終了コード)を返します。 一時変数なしでそれを行うことは可能ですか? さらに明確にする別の例: spd-say "$@" [ $? -ne 127 ] && exit $? この場合、最初のコマンドが見つかった場合にのみ終了します(終了コード!= 127)。そして、私は実際のspd-say終了コードで終了したいです(それはそうではないかもしれません 0)。 編集:私は、移植性を高めるためにPOSIX準拠のソリューションを好むことを忘れていました。 同じコマンドの代替手段を提供したいスクリプトでこの構成を使用します。たとえば、私のcrc32スクリプトを参照してください。 一時変数の問題は、他の変数を隠してしまう可能性があり、長い名前を使用しなければならないことを回避することです。

2
1つのbashファイルに複数のシバン
私は他の人から見たスクリプトがあります(注:これは単一のファイルです)。 #!/bin/bash some commands some commands #!/bin/bash some commands some commands #!/bin/bash some commands some commands 2番目と3番目のシバンの目的は何ですか?それは間違っているのか、それとも故意ですか?

1
選択オプションの表示方法を変更できますか?
私はbashでselectとcaseを使用しています。私には現在9つのオプションがあり、オプションの3x3グリッドをきれいに整頓していますが、次のように表示されます。 1) show all elements 4) write to file 7) clear elements 2) add elements 5) generate lines 8) choose file 3) load file 6) clear file 9) exit 列の前の行に表示したいのですが。 1) show all elements 2) add elements 3) load file 4) write to file 5) generate lines 6) clear file …


4
異なるコマンドの入力を分割して結果を組み合わせる
異なるコマンドの結果を組み合わせる方法を知っています paste -t',' <(commanda) <(commandb) 同じ入力を別のコマンドにパイプすることがわかっている cat myfile | tee >(commanda) >(commandb) これらのコマンドを組み合わせる方法は?できるように cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb ファイルがあるとしましょう myfile: 1 2 3 4 新しいファイルを作りたい 1 4 2 2 3 4 3 2 6 4 1 8 使った cat myfile | tee >(tac) >(awk …

4
フォルダ構造の平坦化
私はこのフォルダー構造を持っています: ├── foo1 │ ├── bar1.txt │ └── bar2.txt ├── foo2 │ ├── bar3.txt │ └── bar4 with a space.txt └── foo3 └── qux1 ├── bar5.txt └── bar6.txt 各フォルダーレベルの間にアンダースコアを付けて、これにフラット化したいと思います。 ├── foo1_bar1.txt ├── foo1_bar2.txt ├── foo2_bar3.txt ├── foo2_bar4 with a space.txt ├── foo3_qux1.bar6.txt └── foo3_qux1_bar5.txt 調べてみましたが、うまくいく解決策が見つかりませんでした。ほとんどの場合、私の問題には2つの特殊性があるためだと思います。ルートレベル内に複数のフォルダーレベルがある場合と、一部のファイルにスペースがある場合があります。 これをbashで達成する方法はありますか?ありがとう! 編集:グリーンジャックマンの提案された回答の実行私はこれを取得します。 第1レベルのフォルダーには2つの下線があります。これを回避する方法、または名前を1つだけアンダースコアに変更する方法はありますか?ありがとう。

5
どのコマンドがタブ区切りのテキストファイルをフィードし、各行を80文字にカットしますか?
(時々)タブ区切りデータの複数行のテキストファイルを持っています。ファイルを一目で確認できるようにファイルを出力したいので、各行の最初の80文字だけを表示したいと思います(各行の最初に重要なものを置くようにテキストファイルを設計しました)。 catを使用してファイルの各行を読み取り、パイプ内の次のコマンドに各行を送信できると思いました。 cat tabfile | cut -c -80 しかし、それは壊れているように見えました。あちこち試してみたところ、grepは機能しているように見えましたが、機能していないことがわかりました(ファイルのすべての行に80文字以上あるわけではありません)。タブは、カットによって1文字として数えられるようです。 私は試した: cat tabfile | tr \t \040 | cut -c -80 空白の読みやすさを排除することで、データを少し壊してしまいます。しかし、それはうまくいきませんでした。どちらもしませんでした: cat tabfile | tr \011 \040 | cut -c -80 多分私はtrを間違って使用していますか?以前にtrで問題があり、複数のスペースを削除したい(このマシンでアクセスできるバージョンのtrには、複数の文字を縮小するための-sオプションが表示されます-もっと操作する必要があるかもしれません) 私がいじったら、perl、awk、sed、またはこれを行うための何かを使うことができると思います。 ただし、(POSIX?)通常のコマンドを使用するソリューションが欲しいので、可能な限り移植性があります。最終的にtrを使用する場合、おそらく最終的にタブを文字に変換して、計算を行い、計算を省略してから、出力用にそれらの文字をタブに戻すことになるでしょう。 1行である必要はなく、コマンドラインで直接入力する必要もありません。スクリプトで問題ありません。 タブファイルの詳細: タブを使用してフィールドを分割します。いつか他のプログラムにデータをインポートしたい場合があるからです。そのため、コンテンツの間にタブが1つしかない傾向があります。ただし、プレーンテキストファイルを読みやすくするために、タブを使用して縦の列に配置しています。つまり、一部のテキストでは、次のフィールドを上下に並べてタブが機能する場所に到達するまで、コンテンツの最後にスペースを埋め込みます。 DarkTurquoise#00CED1海、空、手漕ぎボート MediumSpringGreen#00FA9A木の魔法に便利 ライム#00FF00春のニワトリとfru $でのみ使用

1
バッシュ変数$ {0 ## * /}
私は${0##*/}bashスクリプトで遭遇した変数を理解しようとしています。 $0スクリプトの名前またはパスが含まれていることを理解し##、${parameter##pattern}(source)のように機能します。 しかし、私は/ここで何をしているのか理解できません。私はこの2つのスラッシュによる構文のキンクだけを知っています:${parameter/pat/string} この変数をbashにエコーすると、次のようになりbashます。 最後に、スクリプトを共有する権限がありません。変数が呼び出さSOFT="${0##*/}"れてprintfステートメントで使用されているとだけ言いましょう"Error message sent by $SOFT"

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