将 YAD 结果重定向到文件中,并且仍然将退出代码从按钮提供给 STDOUT

将 YAD 结果重定向到文件中,并且仍然将退出代码从按钮提供给 STDOUT

我的 yad --form 中有 2 个自定义按钮。用户输入(又名结果)被重定向到 .txt 文件以供以后使用。那工作得很好。

但当我以这种方式重定向时,退出代码似乎不再提供给 STDOUT。但当然,我需要退出代码来决定如何继续。

我走在正确的道路上吗?是否还有另一种解决方案仍将退出代码传递到 STDOUT?

yad --title="egPorSS - TYPO3 Constants Setup" --center --borders="20" --width="500" --separator="\n" 2> /dev/null \
        --form \
        --field="egON API-Key":TEXT \
        --field="Host for AJAX-Requests":TEXT \
        --field="SOAP-Username":TEXT \
        --field="SOAP-Password":TEXT \
        --field="SOAP-URL:":TEXT \
        --field="SEPA-Service":CHK \
        --field="Base-Provider":CHK \
        --field="Digital Signature":CHK \
        --field="Company name":TEXT \
        --field="Street, Number":TEXT \
        --field="City":TEXT \ 
        --button="Discard entries":1 \
        --button="Write to DB":0 > ./temp/constants_modified.txt # Write entries to .txt file.

# if Button "Write to DB" is pressed, ask again, before manipulating DB
if [ $? -eq 0 ]; then
        yad --title="egPorSS - TYPO3 Constants Setup" --center --borders="20" 2> /dev/null \
            --text="Write changes to constants field in ${DB} now?" \
            --button="No, discard":0 \
            --button="Yes, write":1 
        # if "Yes, write" => modify ./temp/constants_${DB}.typoscript" and coll pushConstantsDB()
        if [ $? -eq 1 ]; then
            sed -i "s/plugin.tx_egon_pi1.system.apiKey.*/plugin.tx_egon_pi1.system.apiKey = ${modified[0]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.system.host.*/plugin.tx_egon_pi1.system.host = ${modified[1]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.soap.user.*/plugin.tx_egon_pi1.soap.user = ${modified[2]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.soap.password.*/plugin.tx_egon_pi1.soap.password = ${modified[3]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.soap.url.*/plugin.tx_egon_pi1.soap.url = ${modified[4]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.settings.useSEPA.*/plugin.tx_egon_pi1.settings.useSEPA = ${modified[5]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.settings.useBaseProvider.*/plugin.tx_egon_pi1.settings.useBaseProvider = ${modified[6]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.settings.signatureAllowed.*/plugin.tx_egon_pi1.settings.signatureAllowed = ${modified[7]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.custom.companyName.*/plugin.tx_egon_pi1.custom.companyName = ${modified[8]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.custom.companyStreet.*/plugin.tx_egon_pi1.custom.companyStreet = ${modified[9]}/" ${typoscript}
            sed -i "s/plugin.tx_egon_pi1.custom.companyCity.*/plugin.tx_egon_pi1.custom.companyCity = ${modified[10]}/" ${typoscript}
            echo -e "${LIBLUE}Writing changes to Database now.. ${NF}\n"
            pushConstantsDB
        else
            echo -e "${LIBLUE}Returning to main menu without any changes.. ${NF}"
            sleep 6     
        fi
    else
        echo -e "${LIBLUE}Returning to main menu without any changes.. ${NF}"
        sleep 6
    fi

答案1

我知道这是一个老问题,但没有人回答它,而且解决方案确实非常简单。

OP 要求提供 YAD 结果和退出代码。如果我的理解是正确的,则需要在 YAD 中将结果显示为变量(数组更容易),并且我认为退出代码意味着返回代码。返回代码显示按下了哪个按钮,但在OP的帖子中没有任何内容可以收集表单中输入的数据。

需要做的是,如果用户单击“写入数据库”按钮,则从表单保存数据,但随后会显示第二个对话框,请求确认。这可以在显示或不显示新数据的情况下完成,但再次显示它以进行检查是有意义的。这是我的解决方案:

#!/bin/bash
input=$(yad --title="egPorSS - TYPO3 Constants Setup" --center --borders="20" --width="500" --separator="\n" 2> /dev/null \
        --form \
        --field="egON API-Key":TEXT \
        --field="Host for AJAX-Requests":TEXT \
        --field="SOAP-Username":TEXT \
        --field="SOAP-Password":H \
        --field="SOAP-URL:":TEXT \
        --field="SEPA-Service":CHK \
        --field="Base-Provider":CHK \
        --field="Digital Signature":CHK \
        --field="Company name":TEXT \
        --field="Street, Number":TEXT \
        --field="City":TEXT \
        --button="gtk-cancel:1" \
        --button=" Update DB!iconok.png:2"  \
2>/dev/null
);return_code=$?

[[ "$return_code" -eq "2" ]] && { printf '%s\n' "${input[@]}"| yad --text-info --width="400" --height="400" --title="New Data" \
        --button="gtk-cancel:1" \
        --button=" Update DB!iconok.png:2" \
2>/dev/null
};return_code=$?
# See if "Update DB" was clicked
[[ "$return_code" -eq "2" ]] && echo "Update DB was clicked" || echo "Cancel was clicked"

yad 对话框显示所需的数据字段,输出保存在称为输入的数组中。返回代码保存按下的键的值,在本例中,“1”表示单击了“取消”,“2”表示“更新数据库”。我添加了一个简单的检查,可以对其进行操作以再次以表单形式显示数据,并预先填充已输入的值,请求确认。如果确认,则可以处理“输入”数组中的数据。我不明白OP在他的剧本的第二部分中在做什么。

我添加的额外内容:

  • 出于安全目的,隐藏“SOAP 密码”字段中输入的数据。
  • 在“更新数据库”按钮上,我添加了一个绿色复选图标,名为 iconok.png。这使得它看起来比“取消”按钮旁边的空白更好。它看起来是这样的:

亚德形式

这是第二个屏幕,显示输入的数据。但需要时,可以对其进行处理。

YAD 表格中的数据

相关内容