回答:
sh / path / to / scriptは新しいシェルを生成し、現在のシェルとは独立して彼女のスクリプトを実行します。source
(。)コマンドは、現在のシェルでスクリプト内のすべてのコマンドを呼び出します。たとえば、スクリプトがたまたま呼び出しexit
た場合、現在のシェルは失われます。このため、通常、shを使用して別のシェルでスクリプトを呼び出すか、フルパス(/で始まる)または相対パス(./)を使用してバイナリとしてスクリプトを実行する方が安全です。バイナリとして呼び出された場合、指定されたインタープリター(#!/ bin / bashなど)で実行されます。
スクリプトが必要なファイルを見つけるかどうかを知ることに関しては、スクリプトを見てそれが何をするかを見る以外に良い答えはありません。オプションとして、現在のフォルダーを離れることなく、サブプロセスでスクリプトのフォルダーにいつでも移動できます。
$(cd /wherever/ ; sh script.sh)
(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またはシェルにある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
私は通常、スクリプトをファイルシステム階層標準(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
。
なぜ誰もこれを提案していないのか分かりませんが、とても簡単です!私は何度かグーグル検索をしていて、この正確な答えを見つけることができなかったので、共有したいと思いました。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秒かかります。
これが誰かを助けたことを願っています。
古代の質問ですが、時代を超えた質問です。
私が一貫して見た解決策は、$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
bin
ディレクトリにリンクする必要があるとお考えですか。それは面倒です。(3)また、場所の独立性が損なわれます。場合は/home/desmond/bin/foo
、私のスクリプトへのリンクになって、それからBASH_SOURCE
なり/home/desmond/bin/foo
、そしてスクリプトがそのリソースを見つけることができません。
/bin
またはの既知の場所にインストールされ/opt
ます。(3)位置依存性は、相互依存する個人スクリプトのコレクションを作成するときに、これが保持するものとまったく同じです。
. /path/to/script
ソースしていることに注意してください!実行したいだけなら、期間はまったく必要ありません。