[解決済み] UnixのコンソールやMacのターミナルでシェルスクリプトを実行するには?
質問
知っているのに忘れて、また覚え直す。書き留めておく時間です。
解き方は?
非実行ファイルを実行するには
sh
スクリプトを使用します。
sh myscript
実行不可能なものを実行するには
bash
スクリプトを使用します。
bash myscript
実行ファイル(実行権限があるファイル)を起動するには、そのパスを指定するだけです。
/foo/bar
/bin/bar
./bar
スクリプトを実行可能にするには、必要なパーミッションを与えてください。
chmod +x bar
./bar
ファイルが実行可能である場合
カーネル
は、それをどのように実行するかを決定する責任を負います。 バイナリでない場合、これはファイルの最初の行を見ることによって行われます。 この行には
hashbang
:
#! /usr/bin/env bash
ハッシュバングはカーネルに実行するプログラム(この場合、コマンド
/usr/bin/env
を引数として実行します。
bash
). そして、そのスクリプトは、後続の引数としてスクリプトに与えたすべての引数と一緒に(第2引数として)プログラムに渡される。
それはつまり
実行可能なすべてのスクリプトは、ハッシュバンを持つ必要があります。
. もしそうでなければ、あなたはカーネルに対して
は
そのため、カーネルはそれを解釈するためにどのようなプログラムを使用すればよいのかわかりません。 それは
bash
,
perl
,
python
,
sh
などがあります。 (実際には、カーネルはユーザのデフォルトのシェルを使ってファイルを解釈することが多いのですが、これは非常に危険なことです。
sh
と
bash
).
に関するメモ
/usr/bin/env
最も一般的なのは、このようなハッシュバングを見ることです。
#!/bin/bash
その結果、カーネルはプログラムを実行することになります。
/bin/bash
を実行して、スクリプトを解釈します。 残念ながら
bash
はデフォルトで出荷されているとは限らず、また
/bin
. Linux マシンでは通常そうですが、他の POSIX マシンでは
bash
など、様々な場所で出荷されています。
/usr/xpg/bin/bash
または
/usr/local/bin/bash
.
ポータブルなbashスクリプトを書くには、ハードコーディングされた
bash
プログラムです。 POSIXには、それに対処するメカニズムがすでにある。
PATH
. にあるディレクトリのいずれかにプログラムをインストールするというものです。
PATH
そして、プログラムを実行したいときに、システムがそのプログラムを名前で見つけることができるようにする必要があります。
悲しいかな、あなたは できない は、こうすればいい。
#!bash
カーネルは、(ある人はするかもしれませんが)
PATH
を検索してくれます。 をするプログラムがあります。
PATH
という名前で検索してくれるんですけどね。
env
. 幸いなことに、ほとんどすべてのシステムには
env
のプログラムがインストールされています。
/usr/bin
. そこで
env
をハードコードしたパスを使用し、その後に
PATH
を検索してください。
bash
を実行し、あなたのスクリプトを解釈できるようにします。
#!/usr/bin/env bash
この方法には一つ欠点があります。POSIXによると、ハッシュバングには
1つの引数
. この場合
bash
を引数として
env
というプログラムがあります。 に引数を渡すスペースが残っていないことになる。
bash
. のようなものを変換する方法がないわけです。
#!/bin/bash -exu
をこの方式に変更します。 このスキームには
set -exu
をハッシュバンの後に追加してください。
この方法には、もう一つ利点があります。システムによっては
/bin/bash
しかし、ユーザーはそれが気に入らなかったり、バグがあったり、古かったりして、自分の好きな
bash
を他の場所に移す。 OS X (Mac)ではよくあることで、Appleが出荷する古い
/bin/bash
をインストールし、ユーザーは最新の
/usr/local/bin/bash
をHomebrewのようなもので使用します。 を使用した場合
env
を行うアプローチです。
PATH
を検索する場合、ユーザーの好みを考慮し、システムが出荷したものよりもユーザーの好みのbashを使用します。
関連
-
LinuxでSteamをダウンロードしインストールする方法
-
deepinv20 linux ファイルのサフィックスを変更する方法は?Linuxでファイルの拡張子を変更する方法
-
ディープインシステムの画面解像度を設定する方法は?ディープインシステムの解像度を設定する方法
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] 複数のPDFファイルを1つのPDFに結合/変換する【終了】。
-
[解決済み] シェルスクリプトでYYYY-MM-DD形式の日付にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ゼロからLinuxのisoイメージを作る方法(グラフィックチュートリアル)
-
Linux sarコマンドによるシステム性能の詳細解析事例
-
Kali Linuxのマウスライトテーマを変更する方法は?マウスカーソルのテーマを変更するためのヒント
-
Linux 5.10.10 正式版リリース:NULLポインタの不具合修正など。
-
Kali Linuxのデスクトップの外観スタイルを変更するには? KALIの外観の最適化のヒント
-
sudo が sudo として表示される: setuid root である必要がある
-
[解決済み] Linuxでデータファイルから最初の列(実際には行名)を削除する方法は?
-
[解決済み] bash sh - command not found [重複].
-
[解決済み] Linuxで特定のポートで動作しているプロセスを停止させる方法は?
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する