为什么我的脚本在 / 而不是 /mydir 中执行?

为什么我的脚本在 / 而不是 /mydir 中执行?

这是我的脚本,它只是在通知 fs 上的更改时更新 slackware 的本地存储库。它在后台工作,但有一个小问题,而不是在存在 .gpg 的 /userdir 中工作,它在 / 中工作并创建一个新的 .gnupg 目录:/ 当然不起作用。我的问题是:如何强制脚本在 userdir 上工作并读取 userdir 的 gpg-agent 和 .gnupg 密钥环?我已经尝试过 cd 和 (cd /usrdir) 但没有任何效果谢谢

#!/bin/sh
funct()
{
(cd /userdir)         #don't work :(
echo password|/usr/libexec/gpg-preset-passphrase --preset XXXXXXXXXXXXXXXXXXXXXXX
#script update repo http

/usr/local/bin/gen_repos_files.sh -l /tmp/emptylog -v

#find /var/localrepo -type f |xargs chmod 644  -v

}

while inotifywait -o /dev/null -qqre modify /var/localrepo; do funct; done

~~

答案1

( cmd )cmd在子 shell 中执行。即cmd不能影响主shell的环境。跑步

cd /userdir

反而。但当前工作目录不会影响 的使用,gpg因为它期望其配置目录为~/.gnupg.

你的~设置似乎/很奇怪。您可以HOME在脚本的开头设置

export HOME="/userdir"

或仅设置目录gpg

export GNUPGHOME="/userdir"

答案2

这是我的最终脚本 gpg-agent 需要指定 home (--homedir 选项)

#!/bin/sh
export HOME="/userdir"
export GNUPGHOME="/userdir/.gnupg"

funct()
{
pkill gpg-agent
rm ~/.gnupg/S.gpg-agent
mknod -m 700 ~/.gnupg/S.gpg-agent p
eval $(gpg-agent --daemon --allow-preset-passphrase --homedir="$(pwd)")
echo RELOADAGENT | gpg-connect-agent
echo XXX|/usr/libexec/gpg-preset-passphrase --preset XXXXXXXXXXXXXXXX
#script update repo http

/usr/local/bin/gen_repos_files.sh -l /tmp/emptylog -v

find /var/repo/ -type f |xargs chmod 644  -v

}
cd /userdir
while inotifywait -o /dev/null -qqre modify /var/repo; do cd /userdir && funct; done

相关内容