web-dev-qa-db-ja.com

./testではなく.testとして実行

実行可能ファイルと同じフォルダーにいるとすると、実行するには次のように入力する必要があります。

./file

入力する必要はありません /、なぜなら / 入力するのは難しいです。

ファイルを実行する簡単な方法はありますか?理想的には、次のような単純な構文だけです。

.file

または何か他のものを挿入するよりも簡単 / そこにキャラクター。

おそらく、/binディレクトリに何かを配置したり、インタープリターのエイリアスを作成したりして、次のように使用できるようにする方法があります。

p file
26
user214467

それは「危険」かもしれませんが、あなたはただ持つことができます。あなたのPATHに。

他の人が言ったように、これは危険である可能性があるので、常に確認してください。 PATHの最初ではなく最後にあります。

35
HaloJones

../に自動補完されます(.と入力し、 Tab)少なくとも最近のBashシェルでは、複雑な、または安全でない(PATH変更などの)ソリューションを使用する必要はありません。

自動補完されない場合は、「bash-completion」パッケージをインストールする必要があります。

71
l0b0

または..おそらくインタプリタにbashrcファイルのエイリアスを与えてから、単純に

   p  file

そのような関数を書くことは可能です:

p() {
 ./"$@"
}

~/.bashrcで。これで、p app argumentsの代わりに./app argumentsを実行できるようになります。このソリューションは、スクリプトやバイナリを含む、あらゆるタイプの実行可能ファイルに対して機能します。

"$@"は、関数に渡される引数の適切に引用されたリストに展開され(グロブまたは変数展開からのすべての特殊文字を保持します)、@ Scottが指摘したように、bash./最初の1つに残りを保存します。

42
aitap

.$PATHに追加するには、たとえばPATH=$PATH:./etc/profileに追加すると、パス内の他のフォルダー(/usr/bin/など)にある場合を除き、fileと書くだけでfileを実行できます。これは一般に良い考えではないことに注意してください。

それが悪い理由:あなたがディレクトリの内容を完全に信頼していない状況にいるとしましょう-どこか危険な場所からダウンロードしていて、それを実行する前に調査したい、またはシステム管理者がいくつかを手助けしているとしましょうユーザーは、ホームディレクトリなどを調べて、ディレクトリを一覧表示したいので、lsと入力しようとしますが、おっと、タイプミスして、代わりにslと入力してしまいます。この悪意のあるディレクトリの作成者はこれを予期し、それに「sl」と呼ばれるシェルスクリプトを置き、「rm -rf --no-preserve-root /」(またはルートキットのインストールのようなより悪質なもの)を実行します。

(説明のために@Muzerに感謝します)

11
phk

たとえば、インタプリタを呼び出すことができます

bash test

この場合、Shebang行がない場合でもスクリプトは実行されます(例:#!/bin/bash)も実行可能ビットもありません。それを実行するには、正しいインタープリターを知っている必要があります。ファイルのShebang行を最初に読んで、たとえば、Shebang行に次のように記述されている場合、正しいインタープリターを呼び出すことを確認できます。

#!/usr/bin/env python3

あなたは電話するでしょう

python3 test
10
Zanna

私の知る限り、envパスにファイルを含めない限りそれを達成する方法はないので、次のように入力するだけで実行できます:file

.fileは別のファイル名であるため機能しません。これは.fileではなく./fileというファイルです。

スラッシュは、英語以外のレイアウトのため、タイプするのが難しいと思いますか?その場合、私にも起こります。WindowsでAlt + Shiftを押して、キーボードレイアウトを英語に頻繁に入れ替えます(私はsshからLinuxを使用しています)

7
Mc Kernel

人々は.PATHに追加することを提案しています。これは、世界中の書き込み可能なディレクトリに埋め込まれた悪意のあるプログラムを誤って実行するリスクを引き起こすため危険です。しかし、所有していて自分だけが書き込み可能ないくつかのディレクトリに実行可能プログラムがある場合、those director(ies)PATHに、次のような行を追加して

PATH=$PATH:~/dev/myprog1:~/dev/myprog2

~/.bashrcファイルに。もちろん、これはファイルシステムのどこからでも、これらのディレクトリの1つからプログラムを実行できることを意味します。たとえば、cd /etcと入力してfooと入力すると、~/dev/myprog1/fooが実行されます。これには、同じ名前のプログラムを複数のディレクトリに置くことができないという小さな欠点があります。具体的には、~/dev/myprog1~/dev/myprog2の両方にfooというプログラムがある場合、パスを指定しないと2番目のプログラムを実行できません。同様に、~/dev/myprog1/catがある場合—しかし、なぜそうしたいですか?


別のアプローチとして、これを行うプログラムが数個しかない場合は、それらのエイリアスを定義します。

alias gizmo='./gizmo'
alias gonzo='./gonzo'

または、より直感的な場合は、エイリアス.gizmoおよび.gonzoを呼び出すことができます。

実際、これには、ある程度、.PATHに入れるのと同じセキュリティリスクがあります。悪意のあるユーザーが.bashrcを読み取ってエイリアスを確認できる場合、実行を期待して、ランダムなディレクトリにgizmoおよびgonzoと呼ばれるマルウェアを配置する可能性があります。これらには絶対パス名を使用することをお勧めします。

alias gizmo='~/dev/myprog1/gizmo'
alias gonzo='~/dev/myprog2/gonzo'

ちなみに、実行可能ファイルにはtestという名前を付けないでください。これはシェルの組み込みコマンドであり、パスなどのトリックを指定するだけで、その名前でプログラムを実行できます。

構成を開始できる場合

mkdir -p ~/.local/bin
cat > ~/.local/bin/x << 'EOF'
#!/bin/sh
N="$1"
shift
exec "./$N" "$@"
EOF
chmod a+x ~/.local/bin/x

最近のほとんどのディストリビューションでは、すでに$ PATHに〜/ .local/binが含まれています(そうでない場合は、export PATH="$HOME/.local/bin:$PATH"~/.profileに追加してください)。次に、x fileを使用して./fileを実行できます。

.コマンドを定義しようとしないでください。コマンド. scriptは、現在のシェルですでにscriptを実行しています。これにより、scriptが現在のシェルの環境変数を定義できるようになります。

3
sourcejedi

インタプリタに関するZannaの回答を拡張するには(コメント、返信なし):ネイティブ実行可能ファイル(別名バイナリELFファイル)の「インタプリタ」はダイナミックローダー(ld.so)ですが、通常は構文を理解しませんあなたが欲しい:

$ /usr/lib/ld-linux-x86-64.so.2 program
program: error while loading shared libraries: program: cannot open shared object file
$ /usr/lib/ld-linux-x86-64.so.2 ./program
<program is launched>

(また、ld.soをパスにシンボリックリンクしない限り、/sを記述する必要があります)

3
bacondropped

ヘルパースクリプトの作成が許可されている場合は、pwdをPATHに追加するヘル​​パーを作成して、次のコマンドを実行します。

. pathhelper    #adds pwd to path
file            #now it can be run without ./

これにより、「。」の追加が回避されます。パスに移動し、ある時点で何かを実行したいすべてのパスで.profileを汚染します。

PATHを変更して新しいシェルを起動するヘルパーを作成することで、このアプローチをさらに一歩進めることができます。ディレクトリをパラメーターとして(デフォルトとしてpwdを使用して)取る場合、パスを編集するpushdのように機能します。サブシェルを終了すると、他の環境変数への変更は失われることに注意する必要があるかもしれませんが、長時間実行されるシェルでは、PATH変数がすべて散らかることはありません。ワークフローによっては、これが有利な場合があります。

:outer Shell Prompt$; subshellpathhelper    # launches a subshell with modified PATH
: subshell Prompt $ ; file                  # in the subshell it can be run without ./

しかし、それを実行したい場合は、pushdpopdをハックして、他の変更を失うサブシェルを作成せずにパスに同じ変更を加えることができると思います。

pushd --path ~/some/path/    # normal pushd plus adds target to path
file                         # it can be run without ./ until you popd

cdとの類似点がないため、popdを使用して同じことを行うことはできません。)

PATHエントリをプッシュおよびポップする専用のヘルパーのペアを作成することもできます。何が最適に機能するかは、実際の使用パターンによって異なります。

1
ShadSterling