実行可能ファイルと同じフォルダーにいるとすると、実行するには次のように入力する必要があります。
./file
入力する必要はありません /、なぜなら / 入力するのは難しいです。
ファイルを実行する簡単な方法はありますか?理想的には、次のような単純な構文だけです。
.file
または何か他のものを挿入するよりも簡単 / そこにキャラクター。
おそらく、/bin
ディレクトリに何かを配置したり、インタープリターのエイリアスを作成したりして、次のように使用できるようにする方法があります。
p file
それは「危険」かもしれませんが、あなたはただ持つことができます。あなたのPATHに。
他の人が言ったように、これは危険である可能性があるので、常に確認してください。 PATHの最初ではなく最後にあります。
.
は./
に自動補完されます(.
と入力し、 Tab)少なくとも最近のBashシェルでは、複雑な、または安全でない(PATH
変更などの)ソリューションを使用する必要はありません。
自動補完されない場合は、「bash-completion」パッケージをインストールする必要があります。
または..おそらくインタプリタにbashrcファイルのエイリアスを与えてから、単純に
p file
そのような関数を書くことは可能です:
p() {
./"$@"
}
~/.bashrc
で。これで、p app arguments
の代わりに./app arguments
を実行できるようになります。このソリューションは、スクリプトやバイナリを含む、あらゆるタイプの実行可能ファイルに対して機能します。
"$@"
は、関数に渡される引数の適切に引用されたリストに展開され(グロブまたは変数展開からのすべての特殊文字を保持します)、@ Scottが指摘したように、bash
は./
最初の1つに残りを保存します。
.
を$PATH
に追加するには、たとえばPATH=$PATH:.
を/etc/profile
に追加すると、パス内の他のフォルダー(/usr/bin/
など)にある場合を除き、file
と書くだけでfile
を実行できます。これは一般に良い考えではないことに注意してください。
それが悪い理由:あなたがディレクトリの内容を完全に信頼していない状況にいるとしましょう-どこか危険な場所からダウンロードしていて、それを実行する前に調査したい、またはシステム管理者がいくつかを手助けしているとしましょうユーザーは、ホームディレクトリなどを調べて、ディレクトリを一覧表示したいので、lsと入力しようとしますが、おっと、タイプミスして、代わりにslと入力してしまいます。この悪意のあるディレクトリの作成者はこれを予期し、それに「sl」と呼ばれるシェルスクリプトを置き、「rm -rf --no-preserve-root /」(またはルートキットのインストールのようなより悪質なもの)を実行します。
(説明のために@Muzerに感謝します)
たとえば、インタプリタを呼び出すことができます
bash test
この場合、Shebang行がない場合でもスクリプトは実行されます(例:#!/bin/bash
)も実行可能ビットもありません。それを実行するには、正しいインタープリターを知っている必要があります。ファイルのShebang行を最初に読んで、たとえば、Shebang行に次のように記述されている場合、正しいインタープリターを呼び出すことを確認できます。
#!/usr/bin/env python3
あなたは電話するでしょう
python3 test
私の知る限り、envパスにファイルを含めない限りそれを達成する方法はないので、次のように入力するだけで実行できます:file
.file
は別のファイル名であるため機能しません。これは.file
ではなく./file
というファイルです。
スラッシュは、英語以外のレイアウトのため、タイプするのが難しいと思いますか?その場合、私にも起こります。WindowsでAlt + Shiftを押して、キーボードレイアウトを英語に頻繁に入れ替えます(私はsshからLinuxを使用しています)
人々は.
を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
が現在のシェルの環境変数を定義できるようになります。
インタプリタに関する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を記述する必要があります)
ヘルパースクリプトの作成が許可されている場合は、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 ./
しかし、それを実行したい場合は、pushd
とpopd
をハックして、他の変更を失うサブシェルを作成せずにパスに同じ変更を加えることができると思います。
pushd --path ~/some/path/ # normal pushd plus adds target to path
file # it can be run without ./ until you popd
(cd
との類似点がないため、popd
を使用して同じことを行うことはできません。)
PATHエントリをプッシュおよびポップする専用のヘルパーのペアを作成することもできます。何が最適に機能するかは、実際の使用パターンによって異なります。