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

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

4
ファイルの最後で改行文字を削除するにはどうすればよいですか?
改行文字について明確にしましょう: $ echo Hello > file1 ; cat file1 Hello $ echo -n Hello > file2 ; cat file2 Hello$ ここfile1では、末尾に改行文字があり、そうでfile2はないことがわかります。 今私が持っていると仮定しますfile: $ cat file Hello Welcome to Unix $ そしてand Linux、ファイルの最後に追加したいのでecho " and Linux" >> file、改行に追加されます。しかし、最後の行はUnix and Linux したがって、回避するには、ファイルの最後にある改行文字を削除します。したがって、ファイルの最後にある改行文字を削除するにはどうすればよいですか?

2
あとでEOFを引き起こすことなくプロセスの標準入力にデータをパイプする
ユーザーインタラクティブシェルを起動する実行可能ファイルがあります。シェルの起動時に、最初にいくつかのコマンドを挿入してから、ユーザーにインタラクティブセッションを許可します。私はこれを簡単に使用できますecho: echo "command 1\ncommand 2\ncommand3" | ./shell_executable これはほとんど機能します。問題は、コマンドのエコーが完了すると、プロセスのstdinにフィードしているエコーコマンドがEOFに達することです。このEOFにより、シェルはすぐに終了します(シェルでCtrl + Dを押したかのように)。 後でEOFを発生させずにこれらのコマンドをstdinに注入する方法はありますか?

3
localキーワードを使用したbashの変数定義
私はbashスクリプトを学んでおり、これを305行目の/ usr / share / bash-completionで見つけました。 local cword words=() それは何をするためのものか?オンラインのすべてのチュートリアルはただの形式です local var=value


1
ファイル記述子とシェルスクリプト
シェルスクリプトでファイル記述子を使用する方法を理解するのは非常に困難です。 私は次のような基本を知っています exec 5 > /tmp/foo したがって、書き込み用にfd 5がfooに添付されます。 exec 6 < /tmp/bar …読書のため。 exec 5>&- …fdを閉じます。 今、これは何をしますか? #!/bin/bash exec 5 > /tmp/foo exec 6 < /tmp/bar cat <&6 | while read a do echo $a >&5 done 私は理解して&5いるように、fdを閉じますので、各呼び出し後に出力がどのように正常にリダイレクトされていますか? これはからのコピーパスタです:ここ これをシンプルに使用echo $a > fileすると、はるかに速くなると主張していますが、理解できません。適切なチュートリアルへのリンクをいただければ幸いです。私はグーグルパワーが私に失敗しているようだ。

5
getopt、getopts、または手動解析-短いオプションと長いオプションの両方をサポートする場合に使用するもの
現在、次の要件を持つBashスクリプトを作成しています。 さまざまなUnix / Linuxプラットフォームで実行する必要があります 短いオプションと(GNU)長いオプションの両方をサポートする必要があります 私はそれgetoptsが移植性の観点から好ましい方法になることを知っていますが、知る限りでは長いオプションをサポートしていません。 getopt長いオプションをサポートしますが、BashGuideはそれに対して強く推奨します: getopt(1)を使用しないでください。getoptは、空の引数文字列、または空白が埋め込まれた引数を処理できません。それが存在したことを忘れてください。 そのため、手動解析のオプションがまだあります。これはエラーが発生しやすく、かなりの定型コードを生成するため、自分でエラーを処理する必要がありgetopt(s)ます(自分でエラー処理を行うと思います)。 それで、この場合の好ましい選択は何でしょうか?


2
kill、pkill、killallの違いは何ですか
私はkillコマンドに精通していて、ほとんどの場合kill -9を使用してプロセスを強制的に強制終了しますが、他にも使用できる多くのシグナルがありますkill。しかし、すでにkillコマンドがある場合、pkillとのユースケースは何だろうと思いkillallます。 やるpkillとkillall使用しkill、その実施にコマンドを?単なるラッパーであるkillか、独自の実装を持っているのですか? また、pgrepコマンドがプロセス名からプロセスIDを取得する方法を知りたいです。 これらのコマンドはすべて、同じ基になるシステムコールを使用しますか?パフォーマンスの観点からの違いはありますか、どちらが速いですか?

8
bashで大きく、均一に分布したランダムな整数を効率的に生成する方法は?
私が取得するための最良の方法だろうかと思ってきた良い手順の間のランダムな正の整数を取得するにはどうなるか、すなわちbashの、中にランダム性を、MINそしてMAX、そのようなことを 範囲は任意に大きくすることができます(少なくとも2 32 -1まで)。 値は均一に分布しています(つまり、バイアスはありません)。 効率的です。 bashでランダム性を取得する効率的な方法は、$RANDOM変数を使用することです。ただし、これは0から2 15 -1の間の値のみをサンプリングしますが、これはあらゆる目的に十分な大きさではない場合があります。人々は通常、モジュロを使用して必要な範囲にそれを取得します。たとえば、 MIN=0 MAX=12345 rnd=$(( $RANDOM % ($MAX + 1 - $MIN) + $MIN )) さらに、これは、$MAX2 15 -1 = 32767 を分割しない限り、バイアスを作成します。場合などは、$MIN0であり、$MAX9は、その後の値は0〜7のような、わずかにより確からしい値8,9よりも$RANDOMあれば、例えば、このバイアスは、範囲が増加するにつれて悪化32768または32769.なることはありません$MIN0で$MAXあります9999は、その後、2767までの数字0の確率有する4 / 32767 9999 2768数字のみの確率たが、3 / 32767。 したがって、上記の方法は条件3を満たしますが、条件1および2を満たしません。 条件1と2を満たすためにこれまでに思いついた最良の方法は/dev/urandom、次のように使用することでした。 MIN=0 MAX=1234567890 while rnd=$(cat /dev/urandom | tr -dc 0-9 | fold -w${#MAX} | head …

1
SSHによりwhileループが停止します
私はついに数週間苦労してきた問題を解決することができました。リモートでコマンドを実行するために、「承認されたキー」でSSHを使用します。whileループで実行する場合を除き、すべて問題ありません。ループは、sshコマンドでの反復を完了すると終了します。 長い間、これはある種のkshの奇妙さだと思っていましたが、bashが実際に同じように動作することを発見しました。 問題を再現する小さなサンプルプログラム。これは、スナップショットを取得し、クラスター内のノード間でスナップショットを複製する大規模な実装から抽出されます。 #!/bin/bash set -x IDTAG=".*zone" MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)" REMOTE_HOST=sol10-target ZFSPARENT=rpool ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist #for RMT_FILESYSTEM in $(cat /tmp/actionlist) cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED do echo ${RMT_FILESYSTEM}@${MARKER} [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs …

4
JavaScriptシェルはありますか?
最近、私はJSと仕事をしてきましたが、この言語に非常に熱心です。サーバーサイドでJSを実行するためのnode.jsがあることは知っていますが、スクリプト言語としてJSを使用するシェルはありますか?そのようなものが存在する場合、それはどれくらい使いやすく安定していますか?


3
Bashスクリプトファイルをsudo実行すると、Bashスクリプト内のすべてのコマンドもsudoとして実行されますか?
Bashで自動化されたインストール後スクリプト(post-install.shたとえばと呼ばれる)を作成したい。このスクリプトは、リポジトリを自動的に追加および更新し、パッケージをインストールおよび更新し、構成ファイルを編集します。 ここで、たとえばを使用してこのスクリプトを実行するsudo post-install.shと、sudoパスワードの入力が1回だけ求められますか、それともsudoスクリプト内でsudo許可が必要なコマンドを呼び出すたびにパスワードを入力する必要がありますか?言い換えれば、bashスクリプト内のコマンドは、いわば実行権限を「継承」していますか? そして、実際にそうする場合、sudoアクセス許可がタイムアウトする可能性はまだありますか(たとえば、特定のコマンドがsudoタイムアウトを超えるのに十分な時間がかかる場合)?または、最初のsudoパスワード入力は、スクリプト全体が完了するまで続きますか?

4
なぜ-eが括弧()の後にORリスト||が付いたサブシェル内では機能しないのですか?
最近、次のようなスクリプトに遭遇しました。 ( set -e ; do-stuff; do-more-stuff; ) || echo failed これは私には問題ありませんが、機能しません!set -eあなたが追加した場合、適用されません||。それがなければ、うまくいきます: $ ( set -e; false; echo passed; ); echo $? 1 ただし、を追加する||と、set -e無視されます: $ ( set -e; false; echo passed; ) || echo failed passed 実際の独立したシェルを使用すると、期待どおりに機能します。 $ sh -c 'set -e; false; echo passed;' || echo failed …

6
サブシェルからシェルスクリプトを終了する
このスニペットを検討してください。 stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } 通常、funcが呼び出されると、スクリプトが終了します。これは意図した動作です。ただし、次のようなサブシェルで実行される場合 result=`func` スクリプトは終了しません。つまり、呼び出しコードは毎回関数の終了ステータスをチェックする必要があります。これを回避する方法はありますか?これは何のset -eためですか?

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