web-dev-qa-db-ja.com

別のディレクトリからスクリプトを実行する

たいていの場合、実行したいスクリプトが現在の作業ディレクトリにないため、そのままにしたくありません。

別のディレクトリからスクリプト(BASH、Perlなど)を実行することは良い習慣ですか?彼らは通常、適切に実行するために必要なすべてのものを見つけますか?

もしそうなら、「遠い」スクリプトを実行する最良の方法は何ですか?それは...ですか

. /path/to/script

または

sh /path/to/script

そのような場合にSudoを使用する方法は?たとえば、これは機能しません。

Sudo . /path/to/script
11
Desmond Hume

sh/path/to/scriptは新しいシェルを生成し、現在のシェルとは独立して彼女のスクリプトを実行します。 source(。)コマンドは、現在のシェルのスクリプト内のすべてのコマンドを呼び出します。たとえば、スクリプトがexitを呼び出すと、現在のシェルは失われます。このため、通常、shを使用して別のシェルでスクリプトを呼び出すか、フルパス(/で始まる)または相対パス(./)を使用してバイナリとしてスクリプトを実行する方が安全です。バイナリとして呼び出された場合、指定されたインタープリター(#!/ bin/bashなど)で実行されます。

スクリプトが必要なファイルを見つけるかどうかを知ることに関しては、スクリプトを見てそれが何をするかを見る以外に良い答えはありません。オプションとして、現在のフォルダーを離れることなく、サブプロセスでスクリプトのフォルダーにいつでも移動できます。

$(cd /wherever/ ; sh script.sh)

あなたは間違いなくそれを行うことができます(Sudo sh /pathto/script.shまたは./script.shのように他の人が言及した調整を行うと)。ただし、dirsを心配せずに無駄な余分なタイピングを省くために、システム全体で実行するためにいくつかのことの1つを行います。

1)/usr/binへのシンボリックリンク

ln -s /home/username/Scripts/name.sh /usr/bin/name

(名前を明らかに上書きするので、名前が重複していないことを確認してください。)これにより、開発フォルダーにそれらを保持できるので、必要に応じて調整できます。

2)Scripts dirをパスに追加します(.bash_profileまたはシェルにあるwhat.profileを使用)

PATH=/path/to/scripts/:$PATH

3).bash_profile~/.bash_profileにエイリアスを作成し、次のように追加します。

alias l="ls -l"

ご存知のように、構文は単なるエイリアスであり、コマンドとして機能させたい数字です。したがって、ターミナルの任意の場所に「l」と入力すると、ls -lになります。Sudoが必要な場合は、alias sl="Sudo ls -l"を使用して、lとslをメモします(役に立たない例として)。

どちらの方法でも、Sudo nameofscriptと入力するだけですぐに行くことができます。 ./や。をいじる必要はありません。またはshなど。最初に実行可能としてマークするだけです:D

7
nerdwaller

私はいつもあなたが言うようにします

sh /path/to/script

そして、それをルート/スーパーユーザーとして実行するには

Sudo sh /path/to/script

現在のディレクトリは、スクリプトが同じディレクトリにいるとスクリプトが想定している場合にのみ重要です。ほとんどのスクリプトはこれを行わないので、上記のように実行しても問題はありません。

3
Bolli

私は通常、スクリプトを/usr/local/binまたは/usr/local/sbin/(スクリプトにroot権限が必要な場合)に保管します。ファイルシステム階層標準(FHS)によると、これらは属しています。

あなたがしなければならないのは、これら2つのディレクトリがあなたのPATHに追加されていることを確認することです。これを行うには、$HOME/.bashrcファイルを編集して次の行を追加します。

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Sudoを介してrootとしてスクリプトを実行できるようにするには、これらのディレクトリをsecure_pathの変数/etc/sudoersに追加する必要があります。

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

このファイルの編集はvisudoを実行することで行われ、間違いがないことが保証されます。

3
l1zard

なぜ誰もこれを提案していないのかわかりませんが、とても簡単です!私は何度かグーグル検索をしていて、この正確な答えを見つけることができなかったので、共有したいと思いました。 IMO、これが最善の解決策であり、最も簡単な解決策でもありますが、他の人は違った感じやことをするかもしれません。

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

最初に「cd」コマンドで、スクリプトの場所のディレクトリを伝えます。次に、「&&」を使用して、次のコマンドを実行した後に結合できるようにします。最後に、ターミナル内で実行するのと同じようにスクリプトを開きます。をBASHファイルに保存し、セットアップに5秒かかります。

これが誰かを助けたことを願っています。

0
AnonymousX

頻繁に実行する必要があるスクリプトがあり、リソースを見つけるためのスクリプトの場所に依存している場合は、次のようなエイリアスでコマンドを組み合わせるだけで簡単に実行できます。

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

この方法では、機能させるために他のものを変更する必要はありません。

0
EvR2f

Linuxでこのように機能するかどうかはわかりませんが、だれもそれを提案しなかった場合は機能しません。ただし、。/。/を使用してディレクトリに戻る代わりに。引用符を使用して絶対パスを指定できますか?多分それはあなたが実際にそれを考えるようになることさえできるようにするためにドライブ全体へのアクセスを与えるわけではありません。

0
Codezilla