开发者

Bash script doesn't set variable when run from script, but works fine from prompt

开发者 https://www.devze.com 2023-01-05 19:44 出处:网络
Why does the following work from the prompt but fail when stuck inside a bash scrip开发者_C百科t?The bash script produces one empty line leading me to believe the variable isn\'t being set:

Why does the following work from the prompt but fail when stuck inside a bash scrip开发者_C百科t? The bash script produces one empty line leading me to believe the variable isn't being set:

echo "red sox" | read my_var
echo $my_var

UPDATE: Since I guess my example isn't working, what I'm really trying to do is take I/O and pipe it into a variable to so I can do things with it. How do I do this? I thought this should be taken care of by the read command, but maybe there's another way?


If you are asking this because you simplified from a more general problem such as:

someprog args | read my_var

you should be using command substitution:

my_var=$(someprog args)


The reason read doesn't work in a pipe the way you have it is that it creates a subshell. Variables set in a subshell don't persist to their parents. See BashFAQ/024.


You can store the output of a command in a variable using either backticks or $() syntax:

my_var=`cat /some/file.txt`

Now the content of /some/file.txt is stored in $my_var. Same thing, with different syntax:

my_var=$(cat /some/file.txt)


It doesn't work at the prompt. My guess is you already have my_var set in your CLI, and are just retrieving that at the prompt.

Try this:

$ my_var="nothing"; echo "red sox" | read my_var; echo $my_var


If you want the my_var variable to have a constant value, as in your question, why not just do:

my_var="red sox"


What are you trying to do? Please explain what you wan't to do first.

If you're trying to set a variable this is what you need:

my_var="red sox"
echo $my_var

If you need it globally you should set it in env:

export my_var
0

精彩评论

暂无评论...
验证码 换一张
取 消