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を使用する代わりに、テキストエディットで同じファイルを作成し、以前と同じモーションを実行した後、同じ状況になりました。つまり、スクリプトは、アクセス許可の最後に@が表示されている以外は何もしませんでした。
だから私の質問は、なぜこれが機能しないのですか、私は何が間違っているのですか?そして、権限の最後にある@は何ですか?
まず、add「実行」許可ビットが必要です。 chmod +x
を使用すると追加され、chmod -x
は削除されます。
次に、Unixでは、exactファイル名を使用する必要があります。ファイルの名前がhello.sh
の場合は、hello.sh
、nothello
で実行する必要があります。 (おそらく、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@
)を使用してメタデータを表示できます。