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


11

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

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

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

. /path/to/script

または

sh /path/to/script

そしてsudo、そのような場合の使い方は?たとえば、これは機能しません。

sudo . /path/to/script

がスクリプトを. /path/to/script ソースしていることに注意してください!実行したいだけなら、期間はまったく必要ありません。
gniourf_gniourf 2012年

回答:


14

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

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

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

3
もしかして(cd /wherever/ ; sh script.sh)?なぜあなたは$前にいますか?
G-Manは 'Reinstate Monica'を

7

あなたは間違いなくそれを行うことができます(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またはシェルにあるwhatever.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


私は非常にオプション2 recommandう
ベルンハルト

なぜ?、それはベストプラクティスですか、それとも味ですか?
セルジオ

3

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

sh /path/to/script

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

sudo sh /path/to/script

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


/ etc / sudoersファイルでsecure_pathが設定されている場合は機能しません
l1zard

3

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

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

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

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

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

このファイルの編集は実行によって行われるvisudoため、間違いがないことが保証されます。


タイプミス:の.bashrc代わりにという意味です.bachrc
gniourf_gniourf 2012年

0

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


0

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

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

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


0

なぜ誰もこれを提案していないのか分かりませんが、とても簡単です!私は何度かグーグル検索をしていて、この正確な答えを見つけることができなかったので、共有したいと思いました。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秒かかります。

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


-1

古代の質問ですが、時代を超えた質問です。

私が一貫して見た解決策は、$HOME/binディレクトリを作成してそれを最初に配置することです$PATH~/.bashrcまだそこにない場合は、一部のシステムで~/bin$PATHデフォルトで最初に配置されます)。実行のためにスクリプトをそこにドロップするか、スクリプト/実行可能ファイルへのシンボリックリンクを他の場所にドロップすることは、システムや他のユーザーに影響を与えないはずのパスの問題に対処する簡単な方法です。

スクリプトがそれ自身の場所(珍しいことではない)から相対的に見つけることができる追加のリソースを必要とする場合、envvar $BASH_SOURCEが使用されます。$BASH_SOURCEの値に関係なく、常に現在実行中のスクリプト自体への絶対パスが含まれています$PWD

以下を検討してください。

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

それ$HOME/binが最初に表示される$PATHので、入力したものはすべて~/bin実行されます。と呼ばれるデモ用スクリプトがあります~/bin/findme

#!/bin/bash

echo "Running from $BASH_SOURCE"

これは、実行中のスクリプトの場所への絶対パスを取得するために使用できます。

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

(1)これは有用な情報のように見えますが、質問では、自分の場所に関連するリソースを使用するスクリプトをどのように記述するかは質問されていません。スクリプトの実行について尋ねました。(2)2番目の段落がどのように質問に対応しているかわかりません。スクリプトを書いていて、Desmondがそれを実行したい場合は、スクリプトをプライベートbinディレクトリにリンクする必要があるとお考えですか。それは面倒です。(3)また、場所の独立性が損なわれます。場合は/home/desmond/bin/foo、私のスクリプトへのリンクになって、それからBASH_SOURCEなり/home/desmond/bin/foo、そしてスクリプトがそのリソースを見つけることができません。
G-Manは 'Reinstate Monica'を

@ G-Man(1)ユーザーはあまりコンテキストを提供しませんでした。この質問が過去30年間にわたって私に尋ねられたときはいつでも、それは常に、ユーザー(通常は新しいsysopまたは開発者)が自分のスクリプトと他の取得したスクリプトを組み合わせて実行して簡単なタスクを自動化するという状況でした。仕方。これ、ユーザーが求めるスクリプトに関する知識が少しあることを前提としています。(2)システム全体のスクリプトは、通常、/binまたはの既知の場所にインストールされ/optます。(3)位置依存性は、相互依存する個人スクリプトのコレクションを作成するときに、これが保持するものとまったく同じです。
zxq9 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.