为什么 zenity 颜色选择管道到 sed 会破坏代码?

Why zenity color selection piping to sed breaks the code?

我正在尝试使用 sed 将从 zenity 的 --color-selection 对话返回的 12 位十六进制代码转换为 6 位十六进制代码。例如:#dfe251a951a9 到 #df5151。 但是一旦我在下面的代码中使用 sed 它就会破坏整个脚本,并且当我 select "select" 或 "cancel" 按钮时我没有得到相应的回声!有什么问题吗?

在使用 sed 之前:一切正常,但我得到 12 位十六进制代码。

#!/bin/bash
color=$(zenity --color-selection)
if [[ $? == 0 ]]
then 
    echo "You selected $color."
else [[ $? == 1 ]]
    echo "No color selected."
fi

使用 sed 后:当我点击 select 按钮时,我得到 6 位十六进制代码,但是当我点击取消时,我没有得到 "no color selected",它回显 "You selected ."

#!/bin/bash
color=$(zenity --color-selection | sed 's/\(#\?..\)..//g')
if [[ $? == 0 ]]
then 
    echo "You selected $color."
else [[ $? == 1 ]]
    echo "No color selected."
fi

之后

color=$(zenity --color-selection | sed 's/\(#\?..\)..//g')

$?sed(不是 zenity1 的退出状态,即 0。您可以使用

#!/bin/bash
color=$(zenity --color-selection)

# Now $? is the exit status of zenity
if [[ $? == 0 ]]
then
    # Process with sed only if necessary.
    color=$(echo "$color" | sed 's/\(#\?..\)..//g')
    echo "You selected $color"
else
    echo "No color selected."
fi

注意,顺便说一下,我的 zenity (3.16.2) 版本不是 return 十六进制代码,而是某种形式rgb(12,34,56)。我没有调查这种变化发生的时间或原因,但依赖特定格式可能并不明智。

1 更准确地说:它是由 $() 生成的子 shell 的退出状态,它只是将最后一个命令的退出状态转发给它 运行 : sed 电话。