
Ubuntu日本語フォーラム

ログインしていません。
シェルスクリプトについてお伺いします。
VMware-Workstation をインストールしていて、疑問に思ったことがあるので、
質問いたします。
VMwareのマニュアルにある通り、
sudo sh VMware-Workstation-xxxxxxxxxxxxxx.bundle
で、インストールしました。
ただ、
ある解説ページでは、
sudo bash ./VMware-Workstation-xxxxxxxxxxxxxx.bundle
と相対パス「./」を付けているものもあります
相対パス「./」は付けたほうが良いのでしょうか。
又、
つけても付けなくても良いのでしょうか?
又、
シェルスクリプトにおける相対パス「./」はどのような意味を持つのでしょうか?
わかり易い解説ページ等ご紹介いただければありがたいです。
オフライン
./ はパスの通っていないカレントディレクトリで実行ファイルを実行するときに使います。
端末で、
$ echo %PATH
とすると大抵は下記のように表示されると思いますが、
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
これ以外のディレクトリでは、主にセキュリティ上の理由から、デフォルトでプログラムの実行が許可されていません。
カレントディレクトリがホームディレクトリなどにいるときには、このような理由から 実行ファイルの名前の前に ./ を付けてプログラムの実行をすることになっています。
オフライン
ごめんなさい。
$ echo %PATH
は誤りで、
$ echo $PATH
が正しいです。
オフライン
shとbashではスクリプトによっては挙動が違う場合があるので注意してください。というか、bashで動くスクリプトがshでは動かないことがあります。
(/binディレクトリを見るとわかりますが、shは「dash」へのリンクで、bashとは別のプログラムです。)
ちょっと話がずれますが、
端末上で、スクリプトを実行するプログラム(bash、python等)を指定した上で実行する場合、例えば「$ bash ./abc.sh」とする場合は、「./」を省略でき、スクリプトの実行許可も要りません。
これは、プログラム「bash」が./を省略してもパスを認識するからです。
次に、bashなどを書かずに「$ ./abc.sh」と実行する場合です。
Unix系OSでは、スクリプトの1行目に自らを実行するプログラムを指定することが一般的であり、そのようなスクリプトは上記のような実行が可能ですが、その場合にはスクリプトに実行許可を与えた上で、「./」や「../」を含む相対パスや、「/」から始まる絶対パスで指定する必要があります。
オフライン
みなさんありがとうございます。
petitbootang による投稿:
./ はパスの通っていないカレントディレクトリで実行ファイルを実行するときに使います。。
ウィンドウズウィンドウズでの「環境変数のpath」があるのですね。納得です。。。
ただ、今回 sudo sh VMware-Workstation-xxxxxxxxxxxxxx.bundle と、
「./」を付けずに実行できるのは、
「sh」が「bash」と同じように、「./を省略してもパスを認識する」からでしょうか?
あるいはスクリプトの中にpathの記述があるのかな?
vbk による投稿:
端末上で、スクリプトを実行するプログラム(bash、python等)を指定した上で実行する場合、例えば「$ bash ./abc.sh」とする場合は、「./」を省略でき、スクリプトの実行許可も要りません。
これは、プログラム「bash」が./を省略してもパスを認識するからです。
bash のことよくわかりました。
なるほどbashはshの上位互換みたいなもの?(高機能版?) なんですね。。
vbk による投稿:
次に、bashなどを書かずに「$ ./abc.sh」と実行する場合です。
Unix系OSでは、スクリプトの1行目に自らを実行するプログラムを指定することが一般的であり、そのようなスクリプトは上記のような実行が可能ですが、その場合にはスクリプトに実行許可を与えた上で、「./」や「.. /」を含む相対パスや、「/」から始まる絶対パスで指定する必要があります。
sh や bash を使わない方法 よくわかりました。
「実行許可+相対パス又は絶対パス」での実行。
実はこれも別にお聴きしたかったので、解説していただき本当に嬉しいです。
スクリプトの一行目の「#!/bin/sh」の記述がプログラムの指定なんですね。。。納得。。
自分なりに解釈したことをまとめると、vmwareのインストールの場合以下のようになりますでしょうか?
1.sh、bash等のコマンドを使う方法
sudo sh VMware-Workstation-xxxxxxxxxxxxxx.bundle
又は su になっても良い。
sudo bash VMware-Workstation-xxxxxxxxxxxxxx.bundle
今回はbashでも代用できました。
bash は ./を省略できる。
shでも./を省略できるのでしょうか?
あるいはスクリプトの中にpathの記述がないとダメでしょうか?
2.普通のプログラムと同じ方法で実行する方法
シェルスクリプトの先頭に次の行があること。
#!/bin/sh
これは、「#!」以後に書かれたプログラムでこのスクリプトを実行するという意味である。
ファイルに実行属性を付ける。
$ chmod u+x VMware-Workstation-xxxxxxxxxxxxxx.bundle
(又は、guiから→プロパティ→アクセス権→プログラムとして実行できる でもいい)
とし
$ ./VMware-Workstation-xxxxxxxxxxxxxx.bundle
(パスの通っていないカレントディレクトリなら、相対パス「./」は必要)
で実行できる。
以上、自分なりに解釈しましたが、いかがでしょうか?
いろいろ解説ページ等を見ましたが、いまいちよくわからず、
シェルスクリプトの基本みたいなことをお聴きして心苦しかったのですが、
みなさんに、ご回答いただき感謝しています。
オフライン
shのリンク先は、大半のLinuxディストリビューションがbashであり(ネットの情報&PC内のopenSUSEで確認)、dashがリンク先になっているのは稀らしいです。先に書いておけばよかったですね。すみません。
tetsuyakuboさん による投稿:
shでも./を省略できるのでしょうか?
あるいはスクリプトの中にpathの記述がないとダメでしょうか?
shでも./は省略可能です。(経験上、ほとんどのソフトウェアで./は省略可能です)
スクリプト中でpathを変更する機能は通常不要です。
あとの解釈は問題ないと思います。
誰でも皆初めは初心者です。自分も分からないことがたくさんあります。
たくさん使ってたくさん質問して、少しずつ覚えてくださればと思います。
オフライン
tetsuyakubo による投稿:
1.sh、bash等のコマンドを使う方法
sudo sh VMware-Workstation-xxxxxxxxxxxxxx.bundle
又は su になっても良い。
sudo bash VMware-Workstation-xxxxxxxxxxxxxx.bundle
今回はbashでも代用できました。
bash は ./を省略できる。
shでも./を省略できるのでしょうか?
あるいはスクリプトの中にpathの記述がないとダメでしょうか?
shやbash上でコマンドを実行するとき、環境変数のPATHで指定された場所にあるコマンドについては「どこにあるファイルか」を明示しなくても構いません。つまり、/bin/lsを実行したいとすると、PATHに/binが入っていればlsだけで実行できます。
PATHで指定したディレクトリ以外に存在するコマンドを呼び出す場合は、「どこにあるファイルか」を明示しなくてはなりません。ただし、これは絶対指定でも、相対指定でも構いません。つまり、カレントディレクトリが/home/hmatsueである状態で、/bin/lsを実行するためには、/bin/lsとするか、../../bin/lsのどちらかで実行できます。
MS-DOSの場合はカレントディレクトリもコマンドサーチパスに含まれるため、カレントディレクトリにあるコマンドを実行する場合、パス指定する必要は無いのですが、Linux/Unixの文化ではカレントディレクトリをサーチパスに含ませないのが流儀です。
以上は、シェルスクリプトなどを実行する際に、./name_of_shellscript.shのような形で書かれることが多いことの理由です。
shやbashは/binなどのサーチパスに指定されているディレクトリにいるのが普通であるため、shやbashを呼び出すのにパスを指定する必要はありません。今回の例ではsh hogehoge.shのような形式について疑問を持たれたようですが、この場合は、コマンドはshやbashとなります。その後ろのファイル名はshやbashに与える引数になります。shやbashは引数でファイルを指定されると、そのファイルに書かれている内容を実行します。
これはファイル名を引数に与えているのであり、コマンド呼び出しでは無いため、コマンド実行時のサーチパスとは動作、概念が異なります。引数でファイルを指定する場合はカレントディレクトリ基準になり、./hogehoge.shなどと書いても書かなくても同じ動作になります。
オフライン
しまった。余談部分に書くのに熱中し過ぎて、本当に書きたかったことを書き忘れてしまっていました。。
suについては、
https://wiki.ubuntulinux.jp/UbuntuTips/Others/RootSudo
をご一読下さい。
オフライン
hmatsue による投稿:
MS-DOSの場合はカレントディレクトリもコマンドサーチパスに含まれるため、カレントディレクトリにあるコマンドを実行する場合、パス指定する必要は無いのですが、Linux/Unixの文化ではカレントディレクトリをサーチパスに含ませないのが流儀です。
以上は、シェルスクリプトなどを実行する際に、./name_of_shellscript.shのような形で書かれることが多いことの理由です。
shやbashは/binなどのサーチパスに指定されているディレクトリにいるのが普通であるため、shやbashを呼び出すのにパスを指定する必要はありません。今回の例ではsh hogehoge.shのような形式について疑問を持たれたようですが、この場合は、コマンドはshやbashとなります。その後ろのファイル名はshやbashに与える引数になります。shやbashは引数でファイルを指定されると、そのファイルに書かれている内容を実行します。
これはファイル名を引数に与えているのであり、コマンド呼び出しでは無いため、コマンド実行時のサーチパスとは動作、概念が異なります。引数でファイルを指定する場合はカレントディレクトリ基準になり、./hogehoge.shなどと書いても書かなくても同じ動作になります。
自作のスクリプトコマンドを実行するにはパス指定が不可欠だが、
「環境変数PATH(コマンドサーチパス)」の通ったディレクトリに存在する「主要なlinuxコマンド」なら、
当然不要。
コマンド「sh」 の後の ファイル名は 引数であるという解説、とても勉強になりました。
引数であるから「実行属性」もいらない。
「引数でファイルを指定する場合はカレントディレクトリ基準」なので「./」があってもなくても同じとういこと。。。。
hmatsue様、とてもわかり易い解説、ありがとうございました。それと、sudoの利点 よくわかりました。
「ルートパスワードの設定なしでユーザのパスワードで一時的にrootになる」セキュリティの利点を十分活用しろ、ということですね。
vdk様、フォローありがとうございます。
オフライン