ソース フォルダー外の場合、Bash スクリプトは「コマンドが見つかりません」を返します。

ソース フォルダー外の場合、Bash スクリプトは「コマンドが見つかりません」を返します。

私のディレクトリの下に、/home/lucas/bin次のスクリプトがありますterm_multiscreen:

[lucas@lucas-ThinkPad-W520]~$ sudo cat bin/term_multiscreen                              
#!/bin/bash
# Initializes Nvidia Optimus for multi-screen functionality.

xorg_process=$(ps aux | grep 'Xorg' | grep -v grep | awk '{print $2}')
sudo kill -15 $xorg_process
sudo rmmod nvidia
sudo tee /proc/acpi/bbswitch <<<OFF
# xrandr --output VIRTUAL1 --off
[lucas@lucas-ThinkPad-W520]~$ 

の場合cd ~/bin、 で正常に動作しますsudo term_multiscreen。そのディレクトリの外にいるときは、 が返されます。にcommand not foundも があります。何が間違っているのでしょうか?/home/lucas/bin$PATH

ちなみに、私の権限は次のとおりです:

[lucas@lucas-ThinkPad-W520]~$ ls -la bin/
total 44
drwxr-xr-x  2 lucas lucas 4096 May  6 15:43 .
drwxr-xr-x 71 lucas lucas 4096 May  6 15:43 ..
-rwx--x--x  1 root  root   137 Mar  2 03:26 init_multiscreen
-rw-r--r--  1 lucas lucas    0 Mar  2 03:24 init_optimus~
-rwx--x--x  1 root  root   260 Mar  2 05:54 term_multiscreen
[lucas@lucas-ThinkPad-W520]~$ 

ちなみに私はUbuntu 13.10を使用しています

答え1

スクリプトをフルパスで呼び出すことをお勧めします:sudo /home/lucas/bin/term_multiscreenまたは。これにより、 にsudo ~/bin/term_multiscreen関連するセキュリティ上のリスクは発生しません。sudosecure_path

もちろん、これは入力するには長すぎます (管理者は怠け者です)。そのため、次のエイリアスに入力します~/.bashrc

alias tmulti="sudo $HOME/bin/term_multiscreen"

次に、~.bashrcテストのためにリロードします。

. ~/.bashrc
tmulti

常に を使用してスクリプトを呼び出す場合は、スクリプト内の呼び出しsudoを削除することもできます。sudo

答え2

ウブントゥ?

通常のユーザーとしてエイリアスを定義します: alias sudo='sudo env PATH=$PATH'

または、 を実行してにsudo visudo変更します。すると、 はコンパイルされたオプション を使用しません。Defaults secure_pathDefaults !secure_pathsudo--with-secure-path

関連情報