web-dev-qa-db-ja.com

bashスクリプトが機能しないのはなぜですか?

Mac OSXの端末に慣れてきたので、bashスクリプトに手を出すと思いました。座る前に這うのは嫌で、信じられないほどシンプルな「Hello、world!」を書きたかったのです。スクリプトなので、私はこれを行いました:

~/Desktop touch hello.sh
~/Desktop vim hello.sh

次に、これをhello.shに追加しました

#!/bin/bash
echo "Hello, world!"

それから私はこれをしました:

~/Desktop chmod -x hello.sh
~/Desktop hello

その時点では何も起こりませんでした。

私はこれと同じくらい簡単なbashスクリプトをどこかからダウンロードしました:

#!/bin/bash
echo "The current date and time."
date

そして私がしたとき

~/Desktop date

それはまさにそれが想定されていたことをしました。

そこで、ls -lを使用してファイルのアクセス許可を確認したところ、次のようになりました。

-rw-r--r--    1 Mike  staff       33  5 Sep 21:13 hello.sh
-rw-r--r--@   1 Mike  staff       50  5 Sep 21:00 date.sh

明らかに@がすべての違いを生んでいるので、私は思った。 vimを使用する代わりに、テキストエディットで同じファイルを作成し、以前と同じモーションを実行した後、同じ状況になりました。つまり、スクリプトは、アクセス許可の最後に@が表示されている以外は何もしませんでした。

だから私の質問は、なぜこれが機能しないのですか、私は何が間違っているのですか?そして、権限の最後にある@は何ですか?

2

まず、add「実行」許可ビットが必要です。 chmod +xを使用すると追加され、chmod -xは削除されます。

次に、Unixでは、exactファイル名を使用する必要があります。ファイルの名前がhello.shの場合は、hello.shnothelloで実行する必要があります。 (おそらく、Windowsとその%PATHEXT%に慣れていますが、これはUnixには存在しません。ここでは、実行ビットのみが考慮され、.shはシステムにとって無意味です–ファイルcan必要に応じて、単にhelloという名前を付けてください。)

第3に、デフォルトでは、現在のディレクトリはnotコマンドを検索します(セキュリティ上の理由から)。スクリプトは$ PATHに配置するか、フルパス名で実行する必要があります。 .(「現在のディレクトリ」を意味する)を使用するだけで十分です。

〜/デスクトップchmod + x hello.sh〜/デスクトップ./hello.sh
こんにちは世界!
〜/デスクトップ〜/ Desktop/hello.sh
こんにちは世界!
〜/デスクトップ

./hello.shは「現在のディレクトリのhello.sh」を意味します。)

dateと入力すると、not独自のスクリプトを実行しました。システムのdateコマンドを実行しました(chmodと入力したときにシステムのchmodコマンドを実行するのと同じです)。 @notここで違いを生みます。

@文字は、単にそのファイルに関連付けられた「拡張メタデータ」の存在を示します。おそらくテキストエディット特有のものでしょう。 ls(1) のマニュアルページによると、ls -l -@ls -l@)を使用してメタデータを表示できます。

8
user1686