脚本未提取环境变量

时间:2019-01-31 15:54:31

标签: bash shell environment-variables

创建脚本以传递给其他几个人并遇到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.

为了隐私起见,我更改了大多数程序和命令名称。我发布的内容仍然代表正在执行的操作以及如何移动文件。

2 个答案:

答案 0 :(得分:1)

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

在crontab上运行脚本,如下所示: su --login Hustlin /home/Hustlin/directory1/super_cool_script.sh

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

答案 1 :(得分:0)

bash -l -c /path/to/script将使bash首先执行所有.bashrc和.profile文件,因此将设置HOME和PATH变量。