ディレクトリを変更せずにどこからでもプログラムを実行


9

私が現在いるディレクトリを変更せずに、プログラムxを実行するエイリアスを作成したいと思います。

alias x = "cd /home/path_to_x && ./x"

これは機能しますが、ディレクトリが変更されます。私がしたいことは次のようなものです:

alias x="./home/path_to_x/x

しかし、そのようなファイルやディレクトリはありません。誰かがこれの回避策を知っていますか?


9
のようなエイリアスを設定しalias x='/home/path_to_x/x'ます。.以前は使用しないでください/home.(ドット)は現在のディレクトリを指します。
souravc 2014年

2
にいる間にx本当に実行する必要があります/home/path_to_xか?または、特定のディレクトリにあるプログラムを実行する方法がわからないだけですか?
Adaephon 2014年


もう一つの同様の質問askubuntu.com/questions/427818/...
c0rp

回答:


13

CDではなく、絶対パスを使用して実行してください

このバージョン:

cd /home/path_to_x && ./x

ディレクトリを絶対パスに変更し(/home/...ルートディレクトリから開始する方法を確認)、相対パス./x(つまり、新しい作業ディレクトリに対する相対パス)で実行可能ファイルを実行します。

このバージョン:

./home/path_to_x/x

実行可能ファイルを相対パス./home/path_to_x/xで実行しようとします。これは、現在の作業ディレクトリの現在の場所に対する相対パスを意味します。これが、エラーが発生する理由です。この相対パスは実際には存在しません。

必要なコマンドは次のとおりです。

/home/path_to_x/x

絶対パス(ルートディレクトリから開始/)を再度使用します。

また、エイリアスを作成/home/path_to_xするPATH代わりに、に追加することもできます。参照:フルパスを入力せずにスクリプトを実行する方法


これは、提起された質問に対する正解です。
追って通知があるまで一時停止。

1
これは、プログラムが取得される特定のディレクトリでプログラムを実行する必要がある場合にのみ正しくありませんpwd
Kaz Wolfe

@Whaaaaaatは正しいです。/home/path_to_x/xはと機能的に同等ではありません(cd /home/path_to_x && ./x)。機能するかどうかはアプリケーションに依存します。
Rmano 2014年

一般的には正しいですが、この特定の質問では、OPは(1文字の間違いで)絶対パスから実行しようとしているように見えました。ただし、この場合、作業ディレクトリが重要かどうかは明確にわかると思います。
2014年

8

cdがエイリアスの置換後に固執しないようにするには、(yを指定したサブシェルを使用します)

alias my_x="(cd /home/path_to_x && ./x)&" 

あなたはそれをチェックすることができます

alias test_y="(cd /tmp && sleep 10 ) & "

ソリューションに注意しください

alias my_y="/home/path_to_x/x" 

完全に等価ではありません。実際、を介して呼び出された場合my_xxプログラムは現在のディレクトリ/home/path_to_x/で実行されmy_y、によって呼び出された場合x、コマンドmy_yが発行された現在のディレクトリで実行されます。これは、何xをしているのかによって、重要な場合とそうでない場合があります。

OPソリューションについては、次の場所で機能しbashます。

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

ではないzsh

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

それはそのようで はbashと異なる方法でリストを実行zshのそれは私にそれを指し示すための明示的なかっこ...おかげ@EliahKaganを追加することをお勧めですので...。


1
固有のように思われる&よりも後続の優先順位を高く&&するzsh。私が試したsleep 5 && echo done &zshbashkshmkshdash、そして一つでも非ボーンスタイルのシェル(tcsh)。フォアグラウンドでのみzsh評価さsleep 5れます。他のすべてはすぐに戻ってきました(doneもちろん、5秒後にも印刷されました)。一方、これが完全にの特殊性であるとしてもzsh、明示( )(または{ ;})を追加することは、他の人間(またはスクリプトや履歴を後で読むときに自分自身)に意図を伝えるため、合理的だと思います。
Eliah Kagan 2014

4

実行したいファイルがすでに実行可能な場合は、PATH変数に追加してみませんか?

実行可能ファイルが/home/user/aplication/appX単に入力されている場合

PATH=$PATH:/home/user/application

あなたへの~/.bashrc~/.profile

コンソールを再起動したら、次のコマンドで簡単に実行できます appX

これが最もクリーンなソリューションだと思います。


3

&最後にa を置くとうまくいきます:

alias x = "cd /home/path_to_x && ./x &"

2
本気ですか?実行した後x、あなたはです/home/path_to_x&最後に、単純にバックグラウンドでプロセスを送信します。
Rmano 2014年

2
@Rmanoこれは実際に機能します。cdバックグラウンドジョブのsは、呼び出し元に影響を与えません(これは理にかなっています-影響を与えた場合、本当に奇妙です)。これは、非同期実行がサブシェルを使用するためです。なぜそれが機能し、何&が機能するのか、そしてバックグラウンドで実行することが望ましくない場合があることを説明していれば、これはより良いでしょうが、これは(すでに)正しい答えです。(あなたが提案するように明示的に( )構文でサブシェルを作成することはおそらくほとんどの場合より良い解決策です。)
Eliah Kagan

@EliahKaganあなたは正しいです。私はソリューションをチェックしましたがzsh、効果的に機能するのbashではなく機能しzshます...エイリアスがどのように展開されるかには多少の違いがあります。
Rmano 2014年


@Rmanoでに関連する設定を有効にしpushdましたかzsh(私はsetopt autopushd pushdsilent pushdtohome、それは私のcwdを覚えています。)
muru

0

現在のパスワードのバックアップを取得し、コマンドを実行した後、最後のパスワードを元に戻します。

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

そのRmanoのエイリアスの効果を誤解しました。コマンドラインはブロックされていません。エイリアス(test)の出力によってカーソルが次の行にプッシュされただけです。ここでも、何でもやりたいことができます(Enterキーを押して新しいプロンプトを開くなど)。
muru 2014年

うん、そうだね。@mure:|
αғsнιη

二重引用符を使用するので、エイリアスが定義されているときに変数には現在のディレクトリが含まれることに注意してください。一重引用符を使用して、エイリアスが展開されるまで評価を延期します。しかし、あなたの答えがすることpushdpopdしてください。alias x='pushd /home/path_to_x && ./x && popd'
追って通知があるまで一時停止。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.