web-dev-qa-db-ja.com

ビンにプログラムを作成する

リンクしてコンパイルし、C++でプログラムを作成しました。

foobar.out

私はそれをbinディレクトリに入れて、システム全体のコマンドのように使用できるようにしたいです。

ssh, echo, bash, cd...

どうすればそれを達成できますか?

8
NullOverFlow

パスを指定せずにバイナリを実行できるようにするには、2つの方法があります(絶対パスで実行するエイリアスやシェル関数の作成は含まれません)。

  1. $PATHにあるディレクトリにコピーします。
  2. それが存在するディレクトリを$PATHに追加します。

パス内のディレクトリ、たとえば/usr/local/binローカルで管理されているソフトウェアが移動する場所 )にファイルをコピーするには、通常Sudoの使用を意味するスーパーユーザー権限が必要です:

$ Sudo cp -i mybinary /usr/local/bin

ターゲットディレクトリの既存のファイルを上書きしないように注意する必要があります(これが-iを追加した理由です)。


$PATHにディレクトリを追加するには、~/.bashrcファイルに行を追加します(bashを使用している場合):

PATH="$HOME/bin:$PATH"

...バイナリが$HOME/binにある場合。

これには、スーパーユーザー特権を持っている必要も、マシンの基本システムで何かを変更/追加する必要もないという利点があります。バイナリをホームディレクトリのbinディレクトリに移動するだけです。

.bashrcへの変更は、次回ファイルが読み込まれたときに有効になります。これは、新しいターミナルを開いたり、ログアウトして再度ログインしたり、手動でsource ~/.bashrcを実行した場合に発生します。

25
Kusalananda

[〜#〜] path [〜#〜] 変数について詳しく読む必要があります。適切に使用(または変更)してください。

Binディレクトリに配置できるようにしたい

_/bin/_または_/usr/bin/_を意味していると思います。そこに独自のプログラムを追加するのが賢明かどうかはわかりません。おそらく、プログラムをそこに表示したい場合は、その中にシンボリックリンクを挿入することをお勧めします(たとえば、ln -sv $(realpath foobar.out) /usr/bin/のようなものを使用します)。 パッケージマネージャ )。

おそらく、プログラムを_/usr/local/bin/_にインストールする方が賢明です(_/bin/_と_/usr/bin/_の両方をそのままにしておくと、 Linuxディストリビューション によって提供および管理されます)。 [〜#〜] lsb [〜#〜] を参照し、 File Hierarchy Standard の詳細を確認してください。

...システム全体のコマンドのように... cd

これはあなたの側の強い誤解です(質問の元のバリアントでは、後でcdを正しく削除しました)。 cd実行可能 ではなく、また使用できません。これは、シェルの組み込みコマンドです(そしてそうでなければなりません)。

自由にダウンロードできる Advanced Linux Programming を読んで、cdが実行可能にならない理由を理解することをお勧めします(現在の 作業ディレクトリ は各プロセスの状態の一部であり、すべてのプロセスには独自のものがあり、 chdir(2) ...)を使用して変更できます。

10
install /path/to/oobar.out /usr/local/bin/
7
Hauke Laging

実行ファイルを/usr/bin/にコピーすると、echoまたは/usr/bin/の他の実行可能ファイルのように実行できるようになります。

cp -a <filename> /usr/bin/
chmod a+x /usr/bin/filename
4

@Kusalanandaの承認済みの回答に追加します。自家製のスクリプトとプログラムを$ HOME/binに配置するもう1つの利点は、システムをアップグレードするときに失われないことです。これは、個人用ツールボックスを管理するための優れた方法であり、移植性を高めます。

4
Terry Wendt