Bash - 分配变量 - Yad 窗格笔记本
Bash - assigning variables - Yad paned notebook
继之后,换个问题,另一种编写Yad notebook脚本的方法如下。这从 res1 &
和异步操作中删除了 &
。
如@Barmar 所述,"scripts operate sequentially, whereas there is no way to have multiple variable assignments start concurrently and wait for a different pane to get a response."这可能是这个问题的答案。
这是一个解决方案,但它会为两个 Yad 窗格的输出创建一个文件。可以是第二个窗格上带有 tee -a
并使用 sed 修剪字符的文件吗?不是最优雅的解决方案。而且它在字符数上失败了。
#!/bin/bash
#ifs.sh
# no AT bridge
export NO_AT_BRIDGE=1
# yad notebook key
key=$RANDOM
# system management tab
sysvar=$(yad --plug=$key --tabnum=2 --form --columns=1 --editable --separator='' \
--text="<b>Text</b>" \
--field="Threads":NUM \
'3!1..4!1!0' \
--field="Memory":SCL \
'50!10..100!1!0' | tee 0 ) &> res2 &
provar=$(yad --plug=$key --tabnum=1 --form --columns=1 --editable --separator='' \
--text="<b>Text</b>" \
--field="Format":CB \
'RAW!OTHER' \
--field="Calibrate":CHK \
'TRUE!FALSE' | tee 1 ) &> res1 &
yad --notebook --key=$key --center --tab="<b>Process and options</b>" --tab="<b>System settings</b>" \
--text="Text" \
--title="Asterism" \
--buttons-layout=spread \
--button=Quit:1 \
--button=Process:0 2>/dev/null
ret=$?
if [ $ret -eq 0 ]; then
value=`cat 0`
values=`cat 1`
processors=$(echo "$value" | sed s'/.........$//')
memlimit=$(echo "$value" | sed 's/^........//')
echo $processors $memlimit
raw=$(echo "$values" | sed s'/.....$//')
cal=$(echo "$values" | sed 's/^...//')
echo $raw $cal
fi
exit
而且,这是输出...
+ sysvar=3.00000050
+ provar=RAWFALSE
+ ret=0
+ '[' 0 -eq 0 ']'
++ cat 0
+ value=3.00000050
++ cat 1
+ values=RAWFALSE
++ echo 3.00000050
++ sed 's/.........$//'
+ processors=3
++ echo 3.00000050
++ sed 's/^........//'
+ memlimit=50
+ echo 3 50
3 50
++ echo RAWFALSE
++ sed 's/.....$//'
+ raw=RAW
++ echo RAWFALSE
++ sed 's/^...//'
+ cal=FALSE
+ echo RAW FALSE
RAW FALSE
+ exit
编辑:这是一个使用 sed 的 bash 解决方案。将 yad 输出写入文件并使用 sed 进行编辑,而不是尝试从 yad 字符串创建变量 - 没有意义。
编辑:使用剪切
#!/bin/bash
#ifs.sh
# no AT bridge
export NO_AT_BRIDGE=1
# yad notebook key
key=$RANDOM
# system management tab
yad --plug=$key --tabnum=2 --form --columns=1 --editable --separator=':' \
--text="<b>Text</b>" \
--field="Threads":NUM \
'3!1..4!1!0' \
--field="Memory":SCL \
'50!10..100!1!0' > sys | > res2 |
yad --plug=$key --tabnum=1 --form --columns=1 --editable --separator=':' \
--text="<b>Text</b>" \
--field="Format":CB \
'RAW!OTHER' \
--field="Calibrate":CHK \
'TRUE!FALSE' > pro | > res1 |
yad --notebook --key=$key --center --tab="<b>Process and options</b>" --tab="<b>System settings</b>" \
--text="Text" \
--title="Asterism" \
--buttons-layout=spread \
--button=Quit:1 \
--button=Process:0 2>/dev/null
ret=$?
if [ $ret -eq 0 ]; then
thd=$(echo | sed 's/.......:.*//' < sys)
mem=$(echo | sed 's|........:||;s/:$//' < sys)
img=$(echo | sed 's/:.*//' < pro)
cal=$(echo | sed 's/:$//;s|.*:||' < pro)
fi
rm sys pro
exit
继res1 &
和异步操作中删除了 &
。
如@Barmar 所述,"scripts operate sequentially, whereas there is no way to have multiple variable assignments start concurrently and wait for a different pane to get a response."这可能是这个问题的答案。
这是一个解决方案,但它会为两个 Yad 窗格的输出创建一个文件。可以是第二个窗格上带有 tee -a
并使用 sed 修剪字符的文件吗?不是最优雅的解决方案。而且它在字符数上失败了。
#!/bin/bash
#ifs.sh
# no AT bridge
export NO_AT_BRIDGE=1
# yad notebook key
key=$RANDOM
# system management tab
sysvar=$(yad --plug=$key --tabnum=2 --form --columns=1 --editable --separator='' \
--text="<b>Text</b>" \
--field="Threads":NUM \
'3!1..4!1!0' \
--field="Memory":SCL \
'50!10..100!1!0' | tee 0 ) &> res2 &
provar=$(yad --plug=$key --tabnum=1 --form --columns=1 --editable --separator='' \
--text="<b>Text</b>" \
--field="Format":CB \
'RAW!OTHER' \
--field="Calibrate":CHK \
'TRUE!FALSE' | tee 1 ) &> res1 &
yad --notebook --key=$key --center --tab="<b>Process and options</b>" --tab="<b>System settings</b>" \
--text="Text" \
--title="Asterism" \
--buttons-layout=spread \
--button=Quit:1 \
--button=Process:0 2>/dev/null
ret=$?
if [ $ret -eq 0 ]; then
value=`cat 0`
values=`cat 1`
processors=$(echo "$value" | sed s'/.........$//')
memlimit=$(echo "$value" | sed 's/^........//')
echo $processors $memlimit
raw=$(echo "$values" | sed s'/.....$//')
cal=$(echo "$values" | sed 's/^...//')
echo $raw $cal
fi
exit
而且,这是输出...
+ sysvar=3.00000050
+ provar=RAWFALSE
+ ret=0
+ '[' 0 -eq 0 ']'
++ cat 0
+ value=3.00000050
++ cat 1
+ values=RAWFALSE
++ echo 3.00000050
++ sed 's/.........$//'
+ processors=3
++ echo 3.00000050
++ sed 's/^........//'
+ memlimit=50
+ echo 3 50
3 50
++ echo RAWFALSE
++ sed 's/.....$//'
+ raw=RAW
++ echo RAWFALSE
++ sed 's/^...//'
+ cal=FALSE
+ echo RAW FALSE
RAW FALSE
+ exit
编辑:这是一个使用 sed 的 bash 解决方案。将 yad 输出写入文件并使用 sed 进行编辑,而不是尝试从 yad 字符串创建变量 - 没有意义。
编辑:使用剪切
#!/bin/bash
#ifs.sh
# no AT bridge
export NO_AT_BRIDGE=1
# yad notebook key
key=$RANDOM
# system management tab
yad --plug=$key --tabnum=2 --form --columns=1 --editable --separator=':' \
--text="<b>Text</b>" \
--field="Threads":NUM \
'3!1..4!1!0' \
--field="Memory":SCL \
'50!10..100!1!0' > sys | > res2 |
yad --plug=$key --tabnum=1 --form --columns=1 --editable --separator=':' \
--text="<b>Text</b>" \
--field="Format":CB \
'RAW!OTHER' \
--field="Calibrate":CHK \
'TRUE!FALSE' > pro | > res1 |
yad --notebook --key=$key --center --tab="<b>Process and options</b>" --tab="<b>System settings</b>" \
--text="Text" \
--title="Asterism" \
--buttons-layout=spread \
--button=Quit:1 \
--button=Process:0 2>/dev/null
ret=$?
if [ $ret -eq 0 ]; then
thd=$(echo | sed 's/.......:.*//' < sys)
mem=$(echo | sed 's|........:||;s/:$//' < sys)
img=$(echo | sed 's/:.*//' < pro)
cal=$(echo | sed 's/:$//;s|.*:||' < pro)
fi
rm sys pro
exit