当我在终端上放一个命令时,它工作正常,但是当我在.sh脚本中放入相同的命令然后运行它时,它不会给出任何输出。可能是什么原因?
命令:
IFS=$'\t'; while read -r k v; do
export "$k=\"$v\""
答案 0 :(得分:0)
这是预期的,因为export
设置了该特定shell的环境变量。
文档 -
export命令用于将变量或函数导出到 当前shell中运行的所有子进程的环境。 export -f functionname#导出当前shell中的函数。它 使用值导出变量或函数。
因此,当您创建sh
脚本时,它会将指定的命令运行到另一个shell中,该脚本会在脚本退出后终止。
它也适用于sh
脚本 -
<强> data.sh 强>
#!/bin/bash
IFS=$'\t'; while read -r k v; do
export "$k=\"$v\""
echo $HELLO1
echo $SAMPLEKEY
done < <(jq -r '.data | to_entries[] | [(.key|ascii_upcase), .value] | @tsv' data.json)
输出 -
$ ./data.sh
"world1"
"world1"
"samplevalue"
这表明您的变量正在导出但是针对该特定的shell env。
如果您想让它们保持持久性,请尝试通过~/.bashrc
或~/.profile
放置脚本或将其导出。
将它们放入~/.bashrc
或~/.profile
后,您会发现输出内容如下 -
我在MAC OS上使用~/.bash_profile
-
Last login: Thu Jan 25 15:15:42 on ttys006
"world1"
"world1"
"samplevalue"
viveky4d4v@020:~$ echo $SAMPLEKEY
"samplevalue"
viveky4d4v@020:~$ echo $HELLO1
"world1"
viveky4d4v@020:~$
这说明每当你打开一个新shell时你的env变量都会被导出,其逻辑在于.bashrc
(https://unix.stackexchange.com/questions/129143/what-is-the-purpose-of-bashrc-and-how-does-it-work)
将您的脚本放在最后~/.bashrc
-
IFS=$'\t'; while read -r k v; do
export "$k=\"$v\""
echo $HELLO1
echo $SAMPLEKEY
done < <(jq -r '.data | to_entries[] | [(.key|ascii_upcase), .value] | @tsv' data.json)
您需要确保data.json
保留在用户的主目录中。
答案 1 :(得分:0)
基本上:子进程无法更改其父进程的environment。
您需要获取脚本而不是执行它:
source your_script.sh
source
在当前 shell中运行脚本,这样就可以修改环境。
或者,您可以在shell启动文件中创建一个函数(例如〜/ .bashrc):
my_function() {
IFS=$'\t'; while read -r k v; do
export "$k=\"$v\""
done < <(jq -r '.data | to_entries[] | [(.key|ascii_upcase), .value] | @tsv' /path/to/data.json)
}
启动新shell后,您可以运行
my_function