Bash 脚本未拾取环境变量

Bash 脚本未拾取环境变量,bash,shell,environment-variables,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:/usr/bin:/usr/local/games:/snap/bin:/usr/local/go/bin:

创建一个脚本以传递给几个不同的人,并遇到了
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:/usr/bin:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/Hustlin/go/bin
导出GOPATH=$HOME/go
导出路径=$PATH:$GOROOT/bin:$GOPATH/bin
当试图传递脚本时,这并不有利,每个人都必须自己设置这些变量。此文件很少由用户运行,通常通过
crontab
运行

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

提前谢谢大家

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

1,16,31,46****/home/Hustlin/directory1/super\u cool\u script.sh
以下是我正在运行的脚本:

#/bin/bash
#TODO手动将$PATH和$HOME放在此处。
PATH=/home/Hustlin/bin:/home/Hustlin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/bin:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/Hustlin/go/bin
HOME=/HOME/Hustlin
导出GOPATH=$HOME/go
导出路径=$PATH:$GOROOT/bin:$GOPATH/bin
#字段1
field1=“foo”
#欢迎辞。
echo正在启动更新过程。。。
#寄存目录。
mkdir-p$HOME/directory1/sub1/data/body
mkdir-p$HOME/directory1/sub2/system
#运行命令
程序1命令1
#运行更长的命令。
程序1命令2字段1
睡眠3
程序1命令3-o$HOME/directory1/sub1/data$field1
睡眠1
#解压并丢弃不必要的文件。
解压$HOME/directory1/sub1/data/$field1-d$HOME/directory1/sub1/data
rm$HOME/directory1/sub1/data/bar.yaml$HOME/directory1/sub1/data/char.txt
rm$HOME/directory1/sub1/data/$field1.zip
#改名
mv$HOME/directory1/sub1/data/body.json$HOME/directory1/sub1/data/body/$(日期-d'1小时前'+%d-%m-%Y.%H)。json
回波处理完成。

为了保护隐私,我更改了大部分程序和命令名。我在文章中所做的仍然代表了正在做的事情以及文件是如何移动的

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

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

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

在crontab上运行脚本,如下所示:。
su——登录Hustlin/home/Hustlin/directory1/super\u cool\u script.sh

查看此文档。

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

在crontab上运行脚本,如下所示:。
su——登录Hustlin/home/Hustlin/directory1/super\u cool\u script.sh

查看此文档。

脚本是如何执行的(是通过sudo还是其他方式执行的)?能否先回显这些变量,然后执行脚本?编辑请发布演示问题的最低脚本。您只是在展示您的解决方法。如果您的脚本要求$HOME包含您的主目录的路径,而不是运行脚本的用户的主目录,我会认为您的脚本严重损坏。@Williampersell抱歉,我可能用词不好。目前,每个人都必须使用自己的
$HOME
env
变量更新脚本。我想让这一切自动发生,让他们更容易。我不是主张我的
$HOME
应该是每个人的
$HOME
:)当你可以使用任意名称时,你似乎在使用
HOME
。脚本是如何执行的(是通过sudo还是其他方式执行的)?能否先回显这些变量,然后执行脚本?编辑请发布演示问题的最低脚本。您只是在展示您的解决方法。如果您的脚本要求$HOME包含您的主目录的路径,而不是运行脚本的用户的主目录,我会认为您的脚本严重损坏。@Williampersell抱歉,我可能用词不好。目前,每个人都必须使用自己的
$HOME
env
变量更新脚本。我想让这一切自动发生,让他们更容易。我并不是主张我的
$HOME
应该是每个人的
$HOME
:)当您可以使用任意名称时,您似乎正在使用
HOME
。谢谢您的回复!我能够将
35****su--login Hustlin”/home/Hustlin/test1.sh“
添加到
sudo crontab-e
。有没有办法不用sudo就能做到这一点?谢谢你的回复!我能够将
35****su--login Hustlin”/home/Hustlin/test1.sh“
添加到
sudo crontab-e
。没有sudo有没有办法做到这一点?