我有这个 bash 脚本,用于i3wm
在屏幕模式(外部屏幕、内部屏幕、全部或镜像)之间切换。脚本的第一部分获取屏幕的名称。如果我复制以下部分并在终端中运行它:
#!/bin/bash
xrandr|grep " connected primary"|IFS=" " read INTERNAL_OUTPUT con
xrandr|awk '/ connected/ && !/ primary/'|IFS=" " read EXTERNAL_OUTPUT con
echo internal monitor is $INTERNAL_OUTPUT
echo external monitor is $EXTERNAL_OUTPUT
...
我得到了类似
$ ./script.sh
internal monitor is eDPI
external monitor is DPI-1
但是当我运行实际脚本时,变量是空的,我看到的只是
$ ./script.sh
internal monitor is
external monitor is
在脚本中设置变量有什么区别?
答案1
您无法在管道中设置变量,并使值在管道外部可用。运行管道时,每个部分都会运行自己的子 shell,因此命令read
位于其自己的子 shell 中。子 shell 无法修改父级的环境,因此您在那里设置的变量对父级不可用。
为了解决这个问题,您可以按照@AFH 所说的操作并更改命令,以便只打印您想要的内容,然后将其分配给父 shell 中的变量。
或者,您可以重新构造命令,这样您就不会将其输入到 read 中。我更喜欢 AFH 的方法,但重新排序可能看起来像:
IFS=" " read INTERNAL_OUTPUT con < <(xrandr|grep " connected primary")
我们将输入重定向read
到执行其余命令的进程替换,因此read
仍然在父 shell 中。