Io-Redirection

將 YAD 結果重定向到文件中並且仍然將退出程式碼從按鈕提供給 STDOUT

  • October 16, 2018

我的 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

我知道這是一個老問題,但沒有人回答它,解決方案非常簡單。

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”表示“更新 DB”。我添加了一個簡單的檢查,可以對其進行操作以再次在表單中顯示數據,預填充已經輸入的值,請求確認。如果確認,則可以處理“輸入”數組中的數據。我不明白 OP 在他的腳本的第二部分中做了什麼。

我添加的額外內容:

  • 出於安全目的,在“SOAP 密碼”欄位中輸入的數據是隱藏的。
  • 在“更新數據庫”按鈕上,我添加了一個名為 iconok.png 的綠色複選圖示。這使它看起來比在“取消”按鈕旁邊留空白要好。這是它的外觀:

亞德形式

這是第二個螢幕,顯示輸入的數據。這可以被處理,但是是必需的。

來自 YAD 表格的數據

引用自:https://unix.stackexchange.com/questions/462541