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

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

2
関数のローカルでBashスクリプトエコー
bashスクリプトでは、できる限り変数を関数にローカルにして、以下のような関数から必要なものを渡そうとします #!/bin/bash function FUNCTION() { local LOCAL="value" echo "$LOCAL" # return this variable } GLOBAL=$(FUNCTION) echo "$GLOBAL" しかし、関数自体のエコーを含めながらこれを行うことができるので、関数に出力する独自のメッセージがある場合、それらを変数でキャッチする必要はありません #!/bin/bash function FUNCTION() { local LOCAL="value" echo "$LOCAL" # return this variable echo "This function is done now" # do not return this variable } GLOBAL=$(FUNCTION) echo "$GLOBAL" # should only echo …

3
CentOS 7でダブルクリックでシェルスクリプトを起動する方法
shダブルクリックで実行可能なシェルスクリプト()を実行できる必要があります。ファイルのアクセス許可に実行可能フラグを設定しましたが、ファイルをダブルクリックすると、テキストエディターで開きます。カスタムプロパティなどを使用するためのファイルプロパティメニューの下のUIにはオプションがありません。インストールされているさまざまなアプリケーションのみがリストされます。実行したいだけです。どうすればこれを達成できますか?

4
JSON配列の1つのフィールドをbash配列に解析します
変数に格納されたオブジェクトのリストを含むJSON出力があります。(私はその権利を表現していないかもしれません) [ { "item1": "value1", "item2": "value2", "sub items": [ { "subitem": "subvalue" } ] }, { "item1": "value1_2", "item2": "value2_2", "sub items_2": [ { "subitem_2": "subvalue_2" } ] } ] bashスクリプトをubuntu 14.04.1で実行するには、配列内のitem2のすべての値が必要です。 結果全体を配列に入れる方法がたくさん見つかりましたが、必要なアイテムだけではありません

4
OpenSSH RemoteForwardに動的に割り当てられたポートを決定する
質問(TL; DR) リモート転送(-Rオプション)のためにポートを動的に割り当てる場合、リモートマシン上のスクリプト(たとえば、からソース.bashrc)は、どのポートがOpenSSHによって選択されたかをどのように判断できますか? バックグラウンド 私は(両端で)OpenSSHを使用して、他の複数のユーザーと共有している中央サーバーに接続します。私のリモートセッション(今のところ)では、X、cups、pulseaudioを転送したいと思います。 最も簡単なのは、-Xオプションを使用してXを転送することです。割り当てられたXアドレスは環境変数に保存され、DISPLAYそこからほとんどの場合、対応するTCPポートを特定できます。しかし、Xlibが名誉を与えられてDISPLAYいるので、私はほとんど必要としません。 cupsとpulseaudioにも同様のメカニズムが必要です。両方のサービスの基本は、それぞれ環境変数CUPS_SERVERとの形式で存在しPULSE_SERVERます。次に使用例を示します。 ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver export CUPS_SERVER=localhost:12345 lowriter #and I can print using my local printer lpr -P default -o Duplex=DuplexNoTumble minutes.pdf #printing through the tunnel lpr -H localhost:631 -P default -o Duplex=DuplexNoTumble minutes.pdf #printing remotely mpg123 mp3s/van_halen/jump.mp3 #annoy co-workers PULSE_SERVER=localhost:54321 mpg123 mp3s/van_halen/jump.mp3 …

1
IFS nullはunset IFSと同じではありませんか?
ここで、IFSと呼ばれる素晴らしい質問を読みました。回答とコメントがIFS =がIFSの設定を解除することと同じではないことを述べているPOSIXを引用しているので、私は驚きました。IFSの設定を解除すると、明らかにデフォルト値が使用されます。代わりにIFSをnullにすると、スプリッターはありません。私はそれについて別の見方をしたことを知っていて、これを私のブックマークで見つけました: ボーンシェルプログラミング $ IFS スクリプトの最初のステートメントは IFS = これにより、入力フィールドのセパレーターがデフォルト値にリセットされます。それ以外の場合は、ユーザーから$ IFSを継承します。ユーザーは、$ IFSを奇妙な値に設定して、shが期待どおりに文字列を解析しないようにし、奇妙な動作を引き起こす可能性があります。 それでそれは少し前に本当でしたか、それとも著者は間違っていますか?

2
シェルスクリプト:sudoを使用するか、sudoで実行するか?
すべてのコマンドではなく一部のコマンドがスーパーユーザー権限を必要とするシェルスクリプトを記述する場合、 スーパーユーザー権限が必要なコマンドにsudoを追加し、sudoなしでシェルスクリプトを実行する、または スーパーユーザー権限が必要なコマンドにsudoを追加しないでください。ただし、sudoを使用してシェルスクリプトを実行しますか? 2番目の方法では、パスワードを1回入力するだけで済みますが、スクリプト内のすべてのコマンドは、不要なコマンドを含め、スーパーユーザー特権で実行されます。 最初の方法では、さまざまなsudoコマンドにパスワードを複数回提供する必要があるかもしれませんが、スーパーユーザー権限はそれらを必要とするコマンドにのみ付与されます。 セキュリティ上の問題から、最初の方法の方が優れています。便宜上、2番目の方法の方が適しています。 最初の方法を採用することを考えています。したがって、シェルスクリプトで複数のsudoコマンドにパスワードを提供するという不便さに対処する必要があります。 スティーブン・ハリスは書きました: 適切に作成されたスクリプトは、適切な権限で実行されているかどうかを検出し、sudoをまったく呼び出さないでしょうが、多くの不正なスクリプトがあります だから私は2番目の方法を使うべきですか?もしそうなら、 「スクリプトが適切な権限で実行されていて、sudoをまったく呼び出さないかどうかをスクリプトが検出する」と書くにはどうすればよいですか? sudoを使用してスクリプトを実行するときに、スーパーユーザー特権を必要としないコマンドにスーパーユーザー特権を与える問題を回避するために、セキュリティをどのように改善できますか? この単純なアプローチは、両方のアプローチの中で最も優れていますか?それを必要とするだけのコマンドにsudoを追加し、利便性とセキュリティのどちらを望むかに応じて、sudoの有無にかかわらずスクリプトを実行しますか?このアプローチには問題がありますか? ありがとう。

3
エコーまたは印刷/ dev / stdin / dev / stdout / dev / stderr
/ dev / stdin、/ dev / stdout、/ dev / stderrの値を出力したい。 これが私の簡単なスクリプトです: #!/bin/bash echo your stdin is : $(</dev/stdin) echo your stdout is : $(</dev/stdout) echo your stderr is : $(</dev/stderr) 私は次のパイプを使用します: [root@localhost home]# ls | ./myscript.sh [root@localhost home]# testerr | ./myscript.sh 唯一の$(</dev/stdin)私はまた質問の人々が使用していくつかの他に見つけた、仕事に思える:"${1-/dev/stdin}"成功せず、それを試してみました。

1
スクリプトでsudoを使用しているときにGUIプロンプトでパスワードを要求するにはどうすればよいですか?
Trisquel GNU / LinuxをGNOME Flashbackデスクトップ環境で使用しています。sudoスクリプトを使用してコマンドを実行するためのユーザーのGUIパスワードプロンプトが必要です。次のスクリプトの例を検討してください。 zenity --question --text="Do you want to install this package?" if [[ $? -eq 0 ]]; then sudo apt-get install package else zenity --warning fi これは次の方法で実行されます(実行)、つまりターミナル内ではありません。 そのため、コマンドを実行するためにパスワードを要求する必要がありますsudo。そうしないと、ジョブを実行できません。 したがって、GUIプロンプトでパスワードを尋ねるにはどうすればよいですか?

1
systemdがステップEXEC生成スクリプトで失敗しました:権限が拒否されました
いわば「Hello World」サービスを作ろうとしています。呼び出されautologger.serviceてに保存され/usr/lib/systemd/system/autologger.serviceます。 私は試みましsudo service autologger startたsystemctlが、標準を返しました: Job for autologger.service failed. See 'systemctl status autologger.service' and 'journalctl -xn' for details. を確認し/var/log/messagesたところ、次のエラーメッセージが表示されました。 Failed at step EXEC spawning /opt/autologger/placeholder.sh: Permission denied 私の質問は、サービスへのアクセス許可をどのように与えるのですか? サービスユニットファイルは次のとおりです。 [Unit] Description=Hello World DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Service] Type=oneshot ExecStart=/opt/autologger/placeholder.sh placeholder.shには単純に #!/bin/bash echo "Hello World"

7
文字列のリストによるbashループ
このサンプルをフォーマットすることは可能ですか? for i in string1 string2 stringN do echo $i done これに似たものに: for i in string1 string2 stringN do echo $i done 編集:混乱を招いて申し訳ありませんが、スクリプトを実行するさまざまな方法があることを理解していませんでした-sh <scriptname>とbash <scriptname>、今私が名前を付けることができないこのこと- #!/bin/shと#!/bin/bash:)

4
Pythonスクリプトをbashスクリプト内に含める方法
以下のPythonスクリプトをbashスクリプト内に含める必要があります。 bashスクリプトが成功した場合、以下のスクリプトを実行する必要があります。 #!/usr/bin/python from smtplib import SMTP import datetime debuglevel = 0 smtp = SMTP() smtp.set_debuglevel(debuglevel) smtp.connect('192.168.75.1', 25) smtp.login('my_mail', 'mail_passwd') from_addr = "My Name <my_mail@192.168.75.1>" to_addr = "<my_mail@192.168.75.1" subj = "Process completed" date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" ) #print (date) message_text = "Hai..\n\nThe process completed." msg = "From: %s\nTo: %s\nSubject: …

2
Bashのユーティリティプログラムへの連鎖呼び出しをパラメーター化する
Bdinシェルで使用されるブラックボックスUNIXプログラムがあり、stdinからデータの列を読み取り、それらを処理して(平滑化効果を適用して)、stdoutに出力します。UNIXパイプで使用します。たとえば generate | smooth | plot よりスムーズにするために、スムーズを繰り返すことができるので、Bashコマンドラインから次のように呼び出されます。 generate | smooth | smooth | plot あるいは generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot これは厄介です。私は、Bashラッパーを作成して、smoothその出力をsmooth任意の回数の新しいインスタンスにパイプで送り、新しいインスタンスに戻すことができるようにします generate | newsmooth 5 | plot の代わりに generate | smooth | …

4
||で複数のコマンドを使用しない理由 または&&条件付き作業?
これは、シェル(bash、dash)プロンプトで機能します。 [ -z "" ] && echo A || echo B A ただし、私はPOSIXシェルスクリプトを記述しようとしています。 #!/bin/sh [ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1 readonly raw_input_string=${1} [ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1 理由はわかりませんが、メッセージが表示されません: 指定された引数は空です。 このようなスクリプトを呼び出すと: ./test_empty_argument "" 何故ですか?

6
シバン(スクリプト宣言)行が多すぎる-その量を減らす方法はありますか?
約20個の小さな.shファイルで構成されるプロジェクトがあります。一般に、20行を超えるコードを持つファイルはないため、これらを「小さい」と命名します。私はモジュール式のアプローチを採用しました。そのため、Unixの哲学に忠実であり、プロジェクトを維持しやすいからです。 各.shファイルの最初に、を入れました#!/bin/bash。 簡単に言えば、スクリプト宣言には2つの目的があることを理解しています。 これらは、ユーザーがファイルを実行するために必要なシェルを思い出すのに役立ちます(たとえば、ファイルを使用せずに数年後に)。 別のシェルが使用された場合の予期しない動作を防ぐために、特定のシェル(その場合はBash)でのみスクリプトが実行されるようにします。 プロジェクトが5ファイルから20ファイル、または20ファイルから50ファイルに成長し始めると(この場合ではなく、単に説明のため)、20行または50 行のスクリプト宣言があります。一部の人にとっては面白いかもしれませんが、プロジェクトごとに20または50を使用するのではなく、プロジェクトのメインファイルに20または50を使用するのは少し冗長に感じます。 いくつかのメインファイルで「グローバル」スクリプト宣言を使用して、この20または50の冗長性、またはスクリプト宣言の非常に多くの行を回避する方法はありますか?

2
「killl」という名前のスクリプトが失敗するのはなぜですか?
問題のスクリプトは、localhostポート8080で最新のプロセスを終了します。 #!/bin/bash x=$(lsof -i:8080 | tail -1 | awk '{print $2}') kill -9 $x スクリプトの名前が「killl」の場合、機能しませんでした(取得しますか、最新のものを削除しますか?)。cmdsubst> スクリプトの名前を「asdf」に変更するように促されましたが、すべて正常に機能します。この動作の説明はありますか?MacOS ElCapitánを使用しています。
12 shell-script  osx 

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