Io-Redirection
將 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
我知道這是一個老問題,但沒有人回答它,解決方案非常簡單。
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 的綠色複選圖示。這使它看起來比在“取消”按鈕旁邊留空白要好。這是它的外觀:
這是第二個螢幕,顯示輸入的數據。這可以被處理,但是是必需的。