Shell命令 - 如何运行?

时间:2018-01-25 09:20:55

标签: json bash shell

当我在终端上放一个命令时,它工作正常,但是当我在.sh脚本中放入相同的命令然后运行它时,它不会给出任何输出。可能是什么原因?

命令:

IFS=$'\t'; while read -r k v; do 
    export "$k=\"$v\""

2 个答案:

答案 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变量都会被导出,其逻辑在于.bashrchttps://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