
以下のようなファイルの場所にあるときに実行できるアプリケーションがあります。
-$ cd home/myApps/app
-$ ./run.sh
フルパスを指定せずにターミナルのどこからでも run.sh を呼び出したいので、alais を使用して以下のコードを bashrc ファイルに追加してみました。
alias mylovleyapp=/home/myApps/app/run.sh
問題は、mylovleyappを使用してアプリを実行したいときに、run.shがmyAppsフォルダー内の別のファイルに依存しているためにプログラムがエラーを返すことです。
どうすればそれを達成できるでしょうか?
答え1
ローマへ行く道はたくさんあります。
エイリアス
エイリアスを使用する場合は、次のようにします。
alias mylovleyapp='(cd home/myApps/app && ./run.sh)'
中括弧(...)
により、2 つのコマンドがサブシェルで実行されます。したがって、プログラムが終了した後も現在のディレクトリは変更されません。
PATH内のラッパースクリプト
代わりに、ラッパー スクリプトを作成して、検索内のフォルダー (アクセスが必要なユーザーが自分だけの場合や、すべてのユーザーがアクセスする必要がある場合など) に配置することができますPATH
。その後~/.local/bin
は、スクリプトの名前を入力してプログラムを起動するだけです。~/bin
/usr/local/bin
スクリプトは、プログラムを起動するために通常実行するものとまったく同じです。
#!/usr/bin/env bash
cd home/myApps/app
./run.sh
たとえば、そのスクリプトを として保存します~/.local/bin/mylovleyapp
。スクリプトを実行可能にして実行できるようにします。
chmod +x ~/.local/bin/mylovleyapp
~/.local/bin
が存在しない場合は、作成する必要がありますが、ログアウトしてから再度ログインすると、 に自動的に含まれるようになりますPATH
。今後は、mylovleyapp
ターミナルに入力するだけでアプリが実行されます。
答え2
OP がサンプル スクリプトを提供していないので、自分で作成します。ls
スクリプトのディレクトリで実行するという 1 つのことだけを行います。
ls
はい、がなくても実行できることはわかっています./
。ただし、この例では、スクリプトの現在のディレクトリを使用するスクリプトを示すために、 が必要であると仮定しています。
#!/usr/bin/env bash
ls ./
そのスクリプトをどこかに保存します。 として保存します/home/ubuntu/test/myscript
。 を使用して実行可能にしますchmod +x /home/ubuntu/test/myscript
。次に、cd
スクリプトがあるディレクトリ (例: cd /home/ubuntu/test
) に移動し、 を使用してスクリプトを実行します./myscript
。
ubuntu@computer:~/test$ ./myscript
myscript someRandomFile
/
ここまでは順調です。しかし、今度は別のディレクトリから実行してみましょう。この例では、ルート ディレクトリ ( )から実行します。
ubuntu@computer:~/test$ cd /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 lost+found mnt proc run snap sys usr
boot etc init lib32 libx32 media opt root sbin srv tmp var
おっと。ユーザーの場所ではなく、スクリプトの場所にあるファイルを印刷したかったのです。解決策を見つける前に、次のことを考えてみてください。なぜ一瞬だけこの状態./
になります。答えは簡単です。ユーザーのスクリプトのディレクトリではなく、現在のディレクトリです。
スクリプト内からスクリプトのディレクトリを取得するには、このStack Overflowの質問。
要点は簡単です。script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
スクリプトの現在のディレクトリを取得し、それを変数に保存しますscript_dir
。
それに応じてスクリプトを更新しましょう。スクリプトは次のようになります。
#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"
実行して動作するかどうか確認してみましょう:
ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile
うまくいきました! スクリプトと同じディレクトリにいない場合でも、スクリプトのディレクトリ内のファイルを印刷します。これで完了です。全体的なアイデアはシンプルです。スクリプトでは、は./
ユーザーのディレクトリを参照します。"$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
はスクリプトがあるディレクトリを参照します。それに応じてスクリプトを更新すれば、動作するはずです。
答え3
アプリのパスを PATH 変数に追加する必要があります。一時的にこれを行うには、アプリがあるディレクトリに移動して、次の手順を実行します。
PATH=.:$PATH
これで、完全なパスを入力しなくても、どこからでもアプリを呼び出すことができます。ターミナルを閉じると、この設定は失われます。
永続的に設定するには、.bashrc ファイルを編集し、PATH の末尾に :/home/myApps/app を追加する必要があります。新しい .bashrc ファイルを保存し、次の操作を実行します。
source .bashrc
答え4
したがって、作業ディレクトリをターゲット アプリケーションがあるディレクトリに変更し、アプリケーションを実行して依存ファイルを見つけられるようにする必要があります。
エイリアスに 2 つの別々のコマンド (1 つはディレクトリを変更するためのコマンド、もう 1 つはプログラムを実行するコマンド) をセミコロンで区切って指定することで、これを実行できると思います。
したがって、.bashrc
追加内容は次のようになります。
alias mylovleyapp='cd /home/myApps/app; ./run.sh'
これは、依存ファイルが/home/myApps/app
... にあることを前提としています。そうでない場合は、作業ディレクトリを依存ファイルのあるディレクトリに変更し、2 番目のコンポーネントとして絶対パスを使用してアプリを実行します。