bashスクリプトは、その前に「bash」と入力しないと実行されません


11

学校のシステムでは、入力せずにスクリプトファイルを実行しbashたりcsh、スクリプトの種類を指定せずにスクリプトファイルを実行したりできます。ただし、Ubuntuでは、bash script.bashたとえば入力する必要があります。これはUbuntuで常に必要ですか、それとも私が変更できる設定ですか?


1
実行可能ファイルとして設定されていますか?
-jsolarski

はい、ファイルは実行可能です。そのため、私はそれが単独で実行されると思います。
muttley91

1
./scriptを入力するとどのようなエラーが発生しますか?スクリプトが、行末に余分な文字を配置するWindowsエディターから変更されていないことを確認してください これにより、スクリプトをbashで実行する必要があることを示す最初の行が壊れます。
ジョアンピント

1
どのように開始しますか?エラーメッセージは何ですか?
ユーザー不明

.shbashスクリプトに使用しない場合は+1 。ただし、通常、UNIXの世界では、ファイル拡張子は実行可能スクリプトには使用されません。
nyuszika7h

回答:


17
  1. 必ず、./scriptフルパスなどでスクリプトを開始してください。ただscriptかもしれない仕事は(それがディレクトリがある場合に動作する$PATHように、/usr/binUNIXシステムでは、あなたのパスにカレントディレクトリを持っている習慣ではありませんので、(セキュリティ上の理由から、それの良いです!)、)

  2. スクリプトが実行可能であることを確認してくださいchmod +x script。たとえば、実行可能になります。

  3. #!/bin/bashスクリプトの最初の行にあることを確認してください。また、何らかのWindowsエディターで編集されていないことを確認してください。これらは多くの場合、UNIXのものとは異なるeol(行末)の「DOSタイプ」を使用するためです(上記のチェックリストに問題がなければ、インタープリター:そのようなファイルやディレクトリはありません」など、それが/ bin / bashであっても、これは多くの場合、印刷不能としての理由です-したがって、通常は表示されません-\ rはの一部として扱われます通訳者のパス)

すでに言及した他の人:/bin/bashbash機能を使用する場合、それも/bin/shにシンボリックリンクされていることが重要です/bin/bashが、今日では(私が知る限り)シンボリックリンクされdashており、POSIXのみがbash互換性を提供しますsh。当社の非常に高価なソフトウェアでもこの問題があります。スクリプトに#!/bin/shは最初の行が含まれていますが、bashの機能にも依存しています。


そのため、次のように実行する必要があります:./script、私が発見したように。これは、毎回「bash」と入力するよりも優れており、理にかなっています。私はこれを知っていたと思う、それはちょうど私の心を滑らせた。まあ、ありがとう!
muttley91

理論的には、現在の作業ディレクトリをPATH変数に入れることができるので、「./ script」の代わりに「script」だけを使用できますが、警告します。これはUNIXシステムでは習慣ではなく、セキュリティの問題になる可能性があります!また、それは...私はこのソリューションを回避するため、UNIXシステム上の解決策ではありませんでした方法で物事を学ぶために学校で素敵ではありません
LGB

1
または、できれば、#!/usr/bin/env bash少し携帯性が高いです。
Sparhawk

4

ファイルの最初の行が次のようになっていることを確認してください。

#!/bin/bash

シバンがの場合、#!/bin/shbash固有の機能は使用せず、POSIX機能のみを使用する必要があります。の/bin/shシンボリックリンクである場合でもbash、bashはshとして実行されるとPOSIX互換モードで実行され、一部(すべてではない)のbash機能を無効にします。

もちろん、スクリプトが実行可能であることも確認する必要があります。


いいえ、とにかく習慣から抜け出すように設定しました。
muttley91

0

別の強く推奨されていない方法は、に追加する.ことPATHです。

PATH=".:$PATH"

または

PATH="$PATH:."

このアプローチの問題は、前者の場合、システムコマンドが現在のディレクトリの実行可能ファイルでオーバーライドされる可能性があり、後者の場合、未知のコマンドが依然としてオーバーライドされる可能性があることです。

以下を考慮してください。

ファイル:ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

おそらく、手遅れになるまで気付かないでしょう。


1
ここでは、単語の選択が少し誤解を招く可能性があります。コマンドは上書きされません。echoたとえば、システムディレクトリにあるコマンドと同じ名前を持つコマンドが現在の作業ディレクトリにある場合、たとえば、ディレクトリのPATH前に変数が設定されているため、ディレクトリ内のコマンドが使用されます/bin。シェルは、の順序に応じて特定のディレクトリ内のコマンドを単に検索しPATH、何もオーバーライド/破棄しません。しかし、はい、これは意味を持っている
Sergiy Kolodyazhnyyに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.