- サーバー
Linux環境変数PATHの設定方法|exportと.bashrcの使い分け早見表
環境変数PATHとは、コマンド名だけで実行したときに、シェルが実行ファイルを探しに行くフォルダの一覧(: 区切り)です。export PATH="$HOME/bin:$PATH" で今のシェルに追加でき、毎回有効にしたいときは ~/.profile や ~/.bashrc に同じ行を書きます。どのファイルに書くかで「効く場面」が変わるのが、つまずきやすいところです。
この記事では、Ubuntu 24.04(bash 5.2.21)で、ssh・su・su -・sudo・cron・bash -c など12通りの起動方法ごとに、どの設定ファイルが読まれるかを実測した表を中心に、exportの有無で子プロセスに渡るかの違い、PATHの先頭・末尾への追加と重複を防ぐ関数、PATHを壊したときの復旧コマンド、command not foundのチェックリスト(which・type・command -v・hash -r)を、すべて実行結果つきでまとめました。検証は専用の検証ユーザーを作って行い、終了後に削除しています。
環境変数とPATHの早見表
どこに書くか(結論)
| やりたいこと | 書く場所 | 書き方の例 |
|---|---|---|
| 今のシェルだけで一時的に | コマンドラインで | export PATH="$HOME/bin:$PATH" |
| 1つのコマンドにだけ渡す | コマンドの前に | LANG=C sort file.txt |
| 自分のログイン時に毎回(PATHや環境変数) | ~/.profile(~/.bash_profile があればそちら) |
export PATH="$HOME/bin:$PATH" |
| 対話シェルでの設定(エイリアス、プロンプト) | ~/.bashrc |
alias ll='ls -l' |
ssh host コマンド でも効かせたい |
~/.bashrc の先頭(対話チェックより前) |
下の「ssh host コマンド」の節を参照 |
| 全ユーザーに(スクリプトとして) | /etc/profile.d/任意の名前.sh |
export PATH="$PATH:/opt/tool/bin" |
| 全ユーザーに(シェルを問わず、PAM経由) | /etc/environment |
KEY="value"(変数展開は使えない) |
| cronのジョブ | crontabの先頭か、スクリプト内 | PATH=/usr/local/bin:/usr/bin:/bin |
環境変数を確認・操作するコマンド
| コマンド | 意味 |
|---|---|
echo $PATH |
変数の値を表示 |
echo "$PATH" | tr ':' '\n' |
PATHを1行1フォルダで表示 |
env / printenv |
環境変数(子プロセスに渡るもの)の一覧 |
printenv 名前 |
1つの環境変数を表示(なければ終了コード1) |
set |
シェル変数・関数も含めたすべてを表示 |
declare -p 名前 |
変数の属性つきで表示(-x なら環境変数) |
export 名前=値 |
環境変数として設定 |
export -n 名前 |
環境変数をやめてシェル変数に戻す |
unset 名前 |
変数を削除 |
env -i コマンド |
環境変数を空にしてコマンドを実行 |
名前=値 コマンド |
そのコマンドにだけ一時的に渡す |
source ~/.bashrc(. ~/.bashrc) |
設定ファイルを今のシェルに読み直す |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux環境変数PATHの設定方法|exportと.bashrcの使い分け早見表」
環境変数とシェル変数の違い(exportの意味)
シェルの変数には「そのシェルの中だけのシェル変数」と「子プロセスにも渡る環境変数」の2種類があり、export を付けると環境変数になります。下は検証ユーザーで実行した結果です。
MY_VAR=hello
echo $MY_VAR
bash -c 'echo "子プロセス: [$MY_VAR]"'
export MY_VAR
bash -c 'echo "子プロセス: [$MY_VAR]"'
ONLY_ONCE=1 bash -c 'echo "一時的: [$ONLY_ONCE]"'; echo "親: [$ONLY_ONCE]"
declare -p MY_VAR
実行結果(bash 5.2.21):
$ MY_VAR=hello
$ echo $MY_VAR
hello
$ bash -c 'echo "子プロセス: [$MY_VAR]"'
子プロセス: []
$ export MY_VAR
$ bash -c 'echo "子プロセス: [$MY_VAR]"'
子プロセス: [hello]
$ ONLY_ONCE=1 bash -c 'echo "一時的: [$ONLY_ONCE]"'; echo "親: [$ONLY_ONCE]"
一時的: [1]
親: []
$ declare -p MY_VAR
declare -x MY_VAR="hello"
(以降の実行結果では、エラー文の先頭に付くスクリプト名と行番号を bash: に置き換えるか省略しています。)
exportする前は子プロセス(bash -c)から見えず、export後は見えました。名前=値 コマンド の形は、そのコマンドにだけ渡り、親のシェルには残りません。declare -p の -x が「環境変数である」印です。
$ printenv MY_VAR; echo "終了コード=$?"
hello
終了コード=0
$ LOCAL_ONLY=x; printenv LOCAL_ONLY; echo "終了コード=$?"; set | grep ^LOCAL_ONLY
終了コード=1
LOCAL_ONLY=x
$ export -n MY_VAR; bash -c 'echo "export -n 後: [$MY_VAR]"'
export -n 後: []
$ unset MY_VAR; echo "[$MY_VAR]"
[]
$ env | wc -l; set | wc -l
23
56
printenv と env は環境変数だけ、set はシェル変数まで表示します。exportしていない LOCAL_ONLY は printenv では見つからず、set では見つかりました。
| 種類 | 作り方 | 子プロセスに渡るか | 見るコマンド |
|---|---|---|---|
| シェル変数 | NAME=value |
渡らない | set、declare -p |
| 環境変数 | export NAME=value |
渡る | env、printenv、set |
| 一時的な環境変数 | NAME=value コマンド |
そのコマンドにだけ | (コマンドの中で) |
PATHはもともと環境変数なので、PATH=... と書いただけでも子プロセスに渡ります。ただし、新しく作る変数は export を忘れると子に渡らないので、設定ファイルでは export PATH=... のように常にexportを付けて書くと迷いません。
env -i で環境変数を空にする
$ env -i bash -c 'env'
PWD=/home/t109e
SHLVL=0
_=/usr/bin/env
$ env -i PATH=/usr/bin bash -c 'echo $PATH; echo $HOME'
/usr/bin
env -i は環境変数をすべて消した状態でコマンドを起動します。HOMEやLANGも空になるので、「環境変数に頼っていないか」の確認に使えます。なお、PATHが無いとbashは内部の既定値(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)をシェル変数として使いますが、exportはされないので env には出てきません。
Ubuntu 24.04で「どのファイルがいつ読まれるか」を実測
確かめ方:各ファイルに echo を仕込む
各設定ファイルの先頭に「読み込んだ」と表示する1行を入れ、起動方法を変えて表示を集めました。標準出力に出すとscpやsftpの通信を壊すことがあるため、>&2(標準エラー)に出しています。自分の環境で試すときも、検証用ユーザーで行い、終わったら元に戻します。
# 検証用ユーザーの ~/.profile と ~/.bashrc の1行目に追加
echo " 読込: ~/.profile" >&2 # ~/.profile の先頭
echo " 読込: ~/.bashrc" >&2 # ~/.bashrc の先頭
# /etc/profile.d に検証用ユーザーのときだけ表示するファイルを追加(検証後に削除)
# /etc/profile.d/zz-test.sh
[ "$(id -un)" = t109e ] && echo " 読込: /etc/profile(/etc/profile.d 経由)" >&2
# /etc/environment に1行追加(検証後に元に戻す)
T109_ETCENV="yes"
# 起動された側で、ログインシェルか・対話シェルか・/etc/environment が効いているかを表示
echo " → ログイン=$(shopt -q login_shell && echo yes || echo no) 対話=$([[ $- == *i* ]] && echo yes || echo no) T109_ETCENV=${T109_ETCENV:-未設定}"
ログインシェルはログイン時に最初に起動するシェル(shopt login_shell が on)、対話シェルはプロンプトを出して入力を待つシェル($- に i を含む)です。
実測結果の表(~/.bash_profile なし=Ubuntuの初期状態)
| 起動のしかた | ログイン | 対話 | /etc/environment | /etc/profile(profile.d) | /etc/bash.bashrc | ~/.profile | ~/.bashrc |
|---|---|---|---|---|---|---|---|
| sshでログイン | yes | yes | ○ | ○ | ○ | ○ | ○(.profile から) |
ssh host コマンド |
no | no | ○ | × | △ | × | △ |
su - user |
yes | yes | ○ | ○ | ○ | ○ | ○(.profile から) |
su user |
no | yes | ○ | × | ○ | × | ○ |
su - user -c コマンド |
yes | no | ○ | ○ | × | ○ | △(.profile から) |
端末で bash(対話) |
no | yes | 親から継承 | × | ○ | × | ○ |
bash -c コマンド / スクリプト |
no | no | 親から継承 | × | × | × | × |
sudo -u user コマンド |
no | no | ○ | × | × | × | × |
sudo -i -u user コマンド |
yes | no | ○ | ○ | × | ○ | △(.profile から) |
| cron(実際のcronデーモン) | ― | no | ○ | × | × | × | × |
env -i bash -c コマンド |
no | no | × | × | × | × | × |
env -i bash -l -c コマンド |
yes | no | × | ○ | × | ○ | △(.profile から) |
○=読まれて効く、×=読まれない、△=読まれるが、Ubuntu標準の内容では冒頭の「対話でなければ return」で途中終了する。
su - user -c の実際の出力はこうなりました。
### su - user -c コマンド
読込: /etc/profile(/etc/profile.d 経由)
読込: ~/.profile
読込: ~/.bashrc
→ ログイン=yes 対話=no T109_ETCENV=yes
### sudo -u user コマンド
→ ログイン=no 対話=no T109_ETCENV=yes
### cron(/tmp/cron.out に出力)
→ PATH=/usr/bin:/bin
SHELL=/bin/sh
T109_ETCENV=yes
表から読み取れる要点は次のとおりです。
~/.profileが読まれるのはログインシェルだけ。su user(-なし)や端末で開いたbashでは読まれません~/.bashrcは対話シェルで読まれ、ログインシェルでは~/.profileの中から読まれます(Ubuntuの~/.profileに「bashなら .bashrc を読む」と書かれているため)bash -cやシェルスクリプトは、どの設定ファイルも読みません。親から受け継いだ環境変数だけで動きます/etc/environmentはシェルではなくPAM(ログイン処理)が読みます。ssh・su・sudo・cronでは効き、env -iでは効きません- cronは
/bin/shで、PATHは/usr/bin:/bin。~/.profileも~/.bashrcも読まれません
ssh host コマンド で ~/.bashrc が「読まれるのに効かない」理由
### ssh host コマンド
読込: /etc/bash.bashrc
読込: ~/.bashrc
→ ログイン=no 対話=no T109_ETCENV=yes
bashは、sshd から起動されたと判断すると、非対話でも ~/.bashrc を読みます。ところがUbuntuの ~/.bashrc の冒頭には次の行があり、非対話ならすぐ終了します。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
そのため ~/.bashrc の末尾に書いた export PATH=... は ssh host コマンド では効きません。ssh host mytool で command not found になるときは、PATHの設定をこの case 文より上に移すか、ssh host 'bash -lc "mytool"' のようにログインシェルで実行します。なお、~/.bashrc で標準出力に何かを表示すると、scp・sftp・rsyncの通信が崩れることがあるので、表示は対話のときだけにします。
~/.bash_profile を作ると ~/.profile は読まれなくなる
~/.bash_profile を作って、同じ su - user -c を実行しました。
### ~/.bash_profile あり
読込: /etc/profile(/etc/profile.d 経由)
読込: ~/.bash_profile
→ ログイン=yes 対話=no T109_ETCENV=yes
bashのログインシェルは ~/.bash_profile、~/.bash_login、~/.profile の順に探し、最初に見つかった1つだけを読みます。~/.bash_profile を作った途端、~/.profile に書いてあったPATH設定(~/.local/bin の追加など)が効かなくなります。~/.bash_profile を使うなら、先頭で ~/.profile を読み込むと両方が効きます。
# ~/.bash_profile
[ -f ~/.profile ] && . ~/.profile
### ~/.bash_profile から ~/.profile を読むようにした後
読込: /etc/profile(/etc/profile.d 経由)
読込: ~/.bash_profile
読込: ~/.profile
読込: ~/.bashrc
→ ログイン=yes 対話=no T109_ETCENV=yes
flowchart TD
A[bashが起動] --> B{ログインシェル?}
B -- yes --> C["/etc/profile → /etc/profile.d/*.sh"]
C --> D{"~/.bash_profile がある?"}
D -- yes --> E["~/.bash_profile だけ"]
D -- no --> F["~/.profile"]
F --> G["~/.bashrc(Ubuntuの .profile から)"]
B -- no --> H{対話シェル?}
H -- yes --> I["/etc/bash.bashrc → ~/.bashrc"]
H -- no --> J["何も読まない<br/>sshd経由のときだけ ~/.bashrc"]
sudo と su でPATHはどう変わるか
| 実行方法 | 実測したPATH(抜粋) | 理由 |
|---|---|---|
sudo -u user コマンド |
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin |
/etc/sudoers の secure_path に置き換わる |
su user -c コマンド |
/etc/environment と同じ値 |
PAMが /etc/environment を読む |
su - user -c コマンド |
/etc/profile.d で追加されたパス+上記 |
ログインシェルとして /etc/profile を読む |
ssh host コマンド |
/etc/environment と同じ値 |
~/.profile は読まれない |
| cron | /usr/bin:/bin |
cronが固定で設定 |
sudo mytool で command not found になるのは、secure_path に mytool のフォルダが含まれていないためです。sudo "$(command -v mytool)" のようにフルパスで実行するか、/usr/local/bin に置きます。
PATHを追加する:先頭と末尾の違い
PATHは前にあるフォルダから順に探し、最初に見つかったものを実行します。同じ名前の hello を ~/bin と ~/tools/bin に置いて確かめました。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ hello
hello: command not found
$ export PATH="$HOME/bin:$PATH"
$ echo $PATH
/home/t109e/bin:/usr/local/bin:/usr/bin:/bin
$ hello
~/bin の hello
$ export PATH="$PATH:$HOME/tools/bin"
$ hello
~/bin の hello
$ type -a hello
hello is /home/t109e/bin/hello
hello is /home/t109e/tools/bin/hello
| 書き方 | 優先度 | 向いている場面 |
|---|---|---|
export PATH="$HOME/bin:$PATH"(先頭) |
既存のコマンドより優先 | 自分で入れた新しいバージョンを使いたい(Node、Pythonなど) |
export PATH="$PATH:$HOME/tools/bin"(末尾) |
既存のコマンドが優先 | 既存のコマンドと名前がかぶらない追加ツール |
type -a コマンド名 で、PATH上のすべての候補と優先順を確認できます。
重複を防ぐ関数(.bashrc を何度読んでも増えない)
source ~/.bashrc を繰り返すと、同じフォルダが何度も追加されます。
$ export PATH="$HOME/bin:$PATH"; echo $PATH | tr ":" "\n"
/home/t109e/bin
/home/t109e/bin
/usr/local/bin
/usr/bin
/bin
/home/t109e/tools/bin
$ echo "$PATH" | tr ":" "\n" | sort | uniq -d
/home/t109e/bin
「すでに含まれていれば追加しない」関数を ~/.profile などに書いておくと防げます。
path_prepend() {
case ":$PATH:" in
*":$1:"*) ;; # すでに含まれていれば何もしない
*) PATH="$1${PATH:+:$PATH}" ;;
esac
}
path_append() {
case ":$PATH:" in
*":$1:"*) ;;
*) PATH="${PATH:+$PATH:}$1" ;;
esac
}
path_prepend "$HOME/bin"
path_prepend "$HOME/bin" # 2回目は追加されない
path_append "$HOME/tools/bin"
path_append "$HOME/tools/bin" # 2回目は追加されない
export PATH
$ echo $PATH
/home/t109e/bin:/usr/local/bin:/usr/bin:/bin:/home/t109e/tools/bin
前後を : で囲んで比べるのがコツです。/usr/bin と /usr/bin2 のような部分一致を誤判定しません。すでに重複してしまったPATHは、awkで1回だけ整理できます。
PATH=$(printf "%s" "$PATH" | awk -v RS=: -v ORS=: '!seen[$0]++' | sed "s/:$//")
$ PATH=$(printf "%s" "$PATH:/usr/bin:$HOME/bin" | awk -v RS=: -v ORS=: '!seen[$0]++' | sed "s/:$//"); echo $PATH
/home/t109e/bin:/usr/local/bin:/usr/bin:/bin:/home/t109e/tools/bin
PATHを壊したときの復旧
$PATH を付け忘れて PATH=/home/user/bin と上書きすると、ls すら見つからなくなります。
$ PATH=/home/t109e/bin # 「$PATH」を付け忘れて上書き
$ ls
ls: command not found
$ vi --version
vi: command not found
$ /usr/bin/ls -d ~/bin
/home/t109e/bin
フルパスなら動くので、慌てずに次のどれかで戻します。
| 方法 | コマンド | 結果(実測) |
|---|---|---|
| 標準的な値を直接入れる | export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
一般的なコマンドが使える |
| /etc/environment から読む | source /etc/environment |
/usr/local/sbin:...:/usr/games:/usr/local/games:/snap/bin(Ubuntuの既定値) |
| POSIXの最小値 | PATH=$(getconf PATH) |
/bin:/usr/bin |
| シェルを開き直す | ターミナルを閉じて開く、exec bash -l |
設定ファイルから作り直される |
設定ファイル(~/.bashrc など)に間違ったPATHを書いて保存した場合は、次のログインでも壊れた状態になります。そのときはフルパスでエディタを開いて直します。
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/usr/bin/nano ~/.bashrc # または /usr/bin/vi ~/.bashrc
設定ファイルを編集するときは、ターミナルを1つ開いたまま、別のターミナルで新しくログインして確かめると、問題があってもすぐ戻せます。
command not found のチェックリスト
| 順番 | 確認すること | コマンド | よくある原因と対処 |
|---|---|---|---|
| 1 | どこにあるか | type -a 名前、command -v 名前 |
何も出なければPATH上にない。インストール先を find / -name 名前 2>/dev/null で探す |
| 2 | PATHに入っているか | echo "$PATH" | tr ':' '\n' |
入っていなければ export PATH="フォルダ:$PATH" |
| 3 | 設定ファイルが読まれる起動方法か | 上の実測表 | ssh経由・cron・sudoでは ~/.profile や ~/.bashrc が効かない |
| 4 | 実行権限があるか | ls -l ファイル |
Permission denied なら chmod +x ファイル |
| 5 | 以前の場所を覚えていないか | type 名前(hashed と出る) |
hash -r で忘れさせる |
| 6 | カレントのファイルか | ./名前 |
カレントフォルダはPATHに含まれないので ./ を付ける |
| 7 | 設定を書いた後に読み直したか | source ~/.bashrc |
または新しいターミナルを開く |
which・type・command -v の違い
$ which ls; type ls; command -v ls
/usr/bin/ls
ls is /usr/bin/ls
/usr/bin/ls
$ type cd; command -v cd; which cd; echo "which の終了コード=$?"
cd is a shell builtin
cd
which の終了コード=1
$ alias ll="ls -l"; type ll; command -v ll; which ll; echo which=$? # 対話シェルで実行
ll is aliased to `ls -l'
alias ll='ls -l'
which=1
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
| コマンド | 外部コマンド | 組み込みコマンド | エイリアス・関数 | 用途 |
|---|---|---|---|---|
which |
○ | × | × | PATH上のファイルを探すだけ |
type |
○ | ○ | ○ | 人が調べるときの第一候補。-a で全候補 |
command -v |
○ | ○ | ○ | スクリプトで「あるか」を判定(POSIX) |
which は組み込みコマンド(cd、echoなど)やエイリアスを見つけられません。スクリプトでの存在確認は if command -v jq >/dev/null; then ... と書きます。
hash -r:bashが覚えた以前の場所を忘れさせる
bashは一度実行したコマンドの場所を覚えて(ハッシュして)、次からはPATHを探し直しません。新しいバージョンをPATHの前の方に置いても、前のバージョンが実行され続けることがあります。
$ mytool
mytool v1(tools/bin)
$ printf "#!/bin/bash\necho mytool v2(bin)\n" > ~/bin/mytool; chmod +x ~/bin/mytool
$ mytool
mytool v1(tools/bin)
$ type mytool
mytool is hashed (/home/t109e/tools/bin/mytool)
$ hash -r; mytool
mytool v2(bin)
$ rm ~/bin/mytool; mytool
bash: /home/t109e/bin/mytool: No such file or directory
$ hash -r; mytool
mytool v1(tools/bin)
PATHの前の方(~/bin)に v2 を置いても v1 のまま、hash -r で v2 になりました。逆に、覚えていた場所のファイルを消すと No such file or directory になり、これも hash -r で直ります。PATH に代入し直したときは、bashが自動でハッシュを消します。
実行権限がないとき
$ printf "#!/bin/bash\necho tool v1\n" > ~/bin/mytool; mytool
bash: /home/t109e/bin/mytool: Permission denied
$ chmod +x ~/bin/mytool; mytool
tool v1
PATH上にあっても実行権限がなければ Permission denied です。command not found とはメッセージが違うので、見分けの手がかりになります。
/etc/environment と /etc/profile.d の書き方の違い
| ファイル | 読むもの | 書式 | 使える | 反映 |
|---|---|---|---|---|
/etc/environment |
PAM(pam_env) | KEY="value" の行だけ |
固定の値のみ。$PATH などの展開や export は使わない |
次のログインから |
/etc/profile.d/*.sh |
ログインシェルの /etc/profile |
シェルスクリプト | export、$PATH、if など |
次のログインから |
~/.profile |
本人のログインシェル | シェルスクリプト | 同上 | 次のログイン、または source ~/.profile |
~/.bashrc |
本人の対話シェル | シェルスクリプト | 同上 | 新しいターミナル、または source ~/.bashrc |
全ユーザーにPATHを追加するなら、/etc/profile.d/ に .sh ファイルを1つ作るのが管理しやすい方法です。/etc/environment は、cronやsudoのようにシェルの設定ファイルを読まない場面にも値を届けたいときに使います。systemdのサービスは、これらのファイルとは別に、ユニットファイルの Environment= や EnvironmentFile= で設定します。
bash と zsh の違い(要点)
macOS(Catalina以降)の標準シェルはzshです。ファイル名と書き方が少し違います(zshは今回未実行、公式マニュアルに沿って記載)。
| 項目 | bash | zsh |
|---|---|---|
| ログイン時に読む(本人) | ~/.bash_profile → なければ ~/.profile |
~/.zprofile、~/.zlogin |
| 対話時に読む | ~/.bashrc |
~/.zshrc |
| 常に読む(非対話も) | なし(BASH_ENV で指定したときだけ) |
~/.zshenv |
| PATHの追加 | export PATH="$HOME/bin:$PATH" |
同じ書き方に加え、配列 path=($HOME/bin $path) も使える |
| 重複の防止 | 自作関数(上の path_prepend) |
typeset -U path の1行 |
| ハッシュのクリア | hash -r |
rehash |
よくある質問
Q. .bashrc と .profile のどちらにPATHを書けばよいですか?
A. PATHや環境変数は ~/.profile(~/.bash_profile がある環境ではそちら)、エイリアスやプロンプトなど対話の設定は ~/.bashrc が基本です。ただし ssh host コマンド でも効かせたい場合は、~/.bashrc の対話チェックより上にも書く必要があります。
Q. 設定を書いたのに反映されません。
A. ファイルは書いただけでは反映されません。source ~/.profile で読み直すか、ログインし直します。それでも効かない場合は、使っている起動方法でそのファイルが読まれるかを上の実測表で確認します(~/.bash_profile があると ~/.profile は読まれません)。
Q. cronで動かすとコマンドが見つかりません。
A. cronのPATHは /usr/bin:/bin で、~/.profile も ~/.bashrc も読まれません(実測)。crontabの先頭に PATH=/usr/local/bin:/usr/bin:/bin を書くか、スクリプトの中でPATHを設定するか、コマンドをフルパスで書きます。cronの書き方は既存の「cronの書き方」記事にまとめています。
Q. sudo を付けるとコマンドが見つからなくなります。
A. sudoは secure_path でPATHを置き換えるためです。sudo "$(command -v mytool)" とフルパスで渡すか、コマンドを /usr/local/bin に置きます。secure_path を変える場合は visudo で編集します。
まとめ
- PATHはコマンドを探すフォルダの一覧。前にあるほど優先。追加は
export PATH="$HOME/bin:$PATH" exportした変数だけが子プロセスに渡る。env・printenvは環境変数、setはシェル変数まで表示~/.profileはログインシェル、~/.bashrcは対話シェルで読まれる。bash -cやスクリプトはどちらも読まない~/.bash_profileを作ると~/.profileは読まれない。使うなら先頭で. ~/.profilessh host コマンドは~/.bashrcを読むが、冒頭の対話チェックで終了。cronは/usr/bin:/bin、sudoはsecure_path- 重複は
case ":$PATH:"の関数で防ぎ、壊したらexport PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - command not found は
type -a→ PATH → 起動方法 → 実行権限 →hash -rの順に確認
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linux環境変数PATHの設定方法|exportと.bashrcの使い分け早見表」
株式会社RJCでは、Linuxの環境変数のような基礎知識を、動かして確かめながら仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。