【问题标题】:Env variables not being picked up by script脚本未拾取环境变量
【发布时间】:2019-01-31 15:54:31
【问题描述】:

创建一个脚本以传递给几个不同的人并遇到env 问题。除非我在文件开头提供了$PATH$HOME$GOPATH,否则该脚本不会运行。像这样:

HOME=/home/Hustlin

PATH=/home/Hustlin/bin:/home/Hustlin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/bin:/home/Hustlin/go/bin

export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

在尝试传递脚本并且每个人都必须自己设置这些变量时,这并不有利。该文件很少由用户运行,最常通过crontab 运行。

我很想听听更好的编码方式,所以我不会要求我发送脚本的每个人都更新这些变量。

提前谢谢大家!!!

编辑 该脚本通过crontab 运行,没有特殊权限。

1,16,31,46 * * * * /home/Hustlin/directory1/super_cool_script.sh

这是我正在运行的脚本:

#!/bin/bash
# TODO Manually put your $PATH and $HOME here. 

PATH=/home/Hustlin/bin:/home/Hustlin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/bin:/home/Hustlin/go/bin

HOME=/home/Hustlin

export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

# Field1
field1="foo"

# Welcome message. 
echo Starting the update process...

# Deposit directory.
mkdir -p $HOME/directory1/sub1/data/body
mkdir -p $HOME/directory1/sub2/system

# Run command
program1 command1 

# Run longer command. 
program1 command2 field1

sleep 3

program1 command3 -o $HOME/directory1/sub1/data $field1

sleep 1

# Unzip and discard unnecessary files.
unzip $HOME/directory1/sub1/data/$field1 -d $HOME/directory1/sub1/data

rm $HOME/directory1/sub1/data/bar.yaml $HOME/dircetory1/sub1/data/char.txt

rm $HOME/directory1/sub1/data/$field1.zip

# Rename
mv $HOME/directory1/sub1/data/body.json $HOME/directory1/sub1/data/body/$(date -d '1 hour ago' +%d-%m-%Y_%H).json

echo Process complete.

为了隐私,我更改了大部分程序和命令名称。我发布的内容仍然代表正在执行的操作以及文件的移动方式。

【问题讨论】:

  • 脚本是如何执行的(是通过 sudo 还是其他方式)?你能先回显这些变量然后执行脚本吗? 编辑 请发布一个演示问题的最小脚本。您只是在展示您的解决方法。
  • 如果您的脚本要求 $HOME 包含您的主目录的路径,而不是运行该脚本的用户的主目录,我认为您的脚本已严重损坏。
  • @WilliamPursell 抱歉,我可能措辞不佳。目前,每个人都必须使用自己的 $HOMEenv 变量来更新脚本。我想通过自动进行,让他们更轻松。我并不是在提倡我的$HOME 应该是每个人的$HOME :)
  • 您似乎在使用HOME,而您可以使用任意名称。

标签: bash shell environment-variables


【解决方案1】:

问题在于 crontab,而不是脚本。
当您在终端上运行脚本时,您会登录到设置了所有环境变量的会话中,因此脚本可以使用它。
但是当你从 crontab 运行它时,它是一个“空”会话,所以它没有设置任何环境变量,它甚至不知道你的用户。

像这样在 crontab 上运行脚本:。 su --login Hustlin /home/Hustlin/directory1/super_cool_script.sh

查看此文档。
http://man7.org/linux/man-pages/man1/su.1.html

【讨论】:

  • 感谢您的回复!我能够将35 * * * * su --login Hustlin "/home/Hustlin/test1.sh" 添加到sudo crontab -e。有没有办法做到这一点没有 sudo?
【解决方案2】:

bash -l -c /path/to/script 会让 bash 先执行所有的 .bashrc 和 .profile 文件,所以它会设置 HOME 和 PATH 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多