创建脚本以传递给其他几个人并遇到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.
为了隐私起见,我更改了大多数程序和命令名称。我发布的内容仍然代表正在执行的操作以及如何移动文件。
答案 0 :(得分:1)
问题是crontab,而不是脚本。
当您在终端上运行脚本,你登录的所有环境变量设置会话,因此该脚本可以使用它。
但是,当您从crontab运行它时,它是一个“空”会话,因此它没有设置任何环境变量,甚至都不知道您的用户。
在crontab上运行脚本,如下所示:
su --login Hustlin /home/Hustlin/directory1/super_cool_script.sh
答案 1 :(得分:0)
bash -l -c /path/to/script
将使bash首先执行所有.bashrc和.profile文件,因此将设置HOME和PATH变量。