关于linux:系统Shell脚本无法在PATH中找到我的命令

System Shell Scripts Can't Find my Command in PATH

我在/usr/local/scripts/中放置了一个自定义命令(shell脚本)。

为了查看来自/usr/local/scripts的命令,我使用以下方法设置了路径:

  • sudo visudo

    1
    Defaults  secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/scripts"
  • sudo nano /etc/profile

    path="$path:/usr/local/scripts"导出路径

  • sudo nano /etc/login.defs

    env-supath=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/scriptsenv_path path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/local/scripts

  • sudo nano /root/.bashrc

    path="$path:/usr/local/scripts"导出路径

  • sudo nano /etc/environment

    path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/scripts"

  • 这在大多数情况下都有效,但是…

    我有两个脚本,在它们的代码中,调用来自/usr/local/scripts/的脚本,但它找不到我的脚本!

    第一个是/etc/network/if-up.d/sendip,它在网络堆栈初始化时作为根运行。

    第二个是/usr/local/scripts/notif-login,由/etc/pam.d/sshd作为pam的根运行:

    1
    session optional pam_exec.so /usr/local/scripts/notif-login

    如果我从我的终端shell运行这两个脚本,另一个用户,使用sudo,不使用sudo,在su之后,或者使用root登录之后,它都正常工作。但是当系统运行它时(第一次是网络初始化时,第二次是通过ssh),两个都无法从/usr/local/scripts运行脚本。

    有没有其他地方我必须设置路径?


    bash/sh不会为"非交互shell"读取/etc/profile,例如您提到的脚本运行的shell。我不确定您使用的是哪个发行版,但是您应该能够将它添加到/etc/environmentPATH定义中。ob-ubuntu,例如:

    变化:

    1
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

    到:

    1
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/scripts"

    编辑

    这应该在Raspbian下工作,在Debian下工作。如果没有,您可能需要在其中一个脚本的开头修改路径。对于bash下的非交互式会话,不会执行任何正常的启动文件。还可以尝试输出$SHELL,并确保脚本在您认为的shell下运行。