hen*_*dry 9 shell parsing split cpu-word argument-passing
解析/ proc/cmdline的大多数脚本将其分解为单词,然后使用case语句过滤掉参数,例如:
CMDLINE="quiet union=aufs wlan=FOO"
for x in $CMDLINE
do
»···case $x in
»···»···wlan=*)
»···»···echo "${x//wlan=}"
»···»···;;
»···esac
done
Run Code Online (Sandbox Code Playgroud)
问题是WLAN ESSID有空格.用户希望设置wlan='FOO
BAR'(就像一个shell变量),然后'FOO用上面的代码得到意想不到的结果,因为for循环在空格上分割.
是否有一种更好的方法来解析/proc/cmdlineshell脚本几乎没有评估它?
还是有一些引用技巧?我以为我可能会要求用户实体引用空格并解码如下:/bin/busybox httpd -d "FOO%20BAR".或者这是一个糟糕的解决方案?
Shr*_*m V 22
有一些方法:
cat /proc/PID/cmdline | tr '\000' ' '
cat /proc/PID/cmdline | xargs -0 echo
这些适用于大多数情况,但是当参数中包含空格时会失败.但是我确实认为有比使用更好的方法/proc/PID/cmdline.
小智 10
set -- $(cat /proc/cmdline)
for x in "$@"; do
case "$x" in
wlan=*)
echo "${x#wlan=}"
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
使用xargs -n1:
[centos@centos7 ~]$ CMDLINE="quiet union=aufs wlan='FOO BAR'"
[centos@centos7 ~]$ echo $CMDLINE
quiet union=aufs wlan='FOO BAR'
[centos@centos7 ~]$ echo $CMDLINE | xargs -n1
quiet
union=aufs
wlan=FOO BAR
[centos@centos7 ~]$ xargs -n1 -a /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-862.14.4.el7.x86_64
root=UUID=3260cdba-e07e-408f-93b3-c4e9ff55ab10
ro
consoleblank=0
crashkernel=auto
rhgb
quiet
LANG=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
豪华:
$ f() { echo $1 - $3 - $2 - $4
> }
$ a="quiet union=aufs wlan=FOO"
$ f $a
quiet - wlan=FOO - union=aufs -
Run Code Online (Sandbox Code Playgroud)
您可以定义一个函数并将不带引号的$CMDLINE作为该函数的参数。然后您将调用 shell 的解析机制。请注意,您应该在它将运行的 shell 上对其进行测试 - zsh 通过引用做了一些有趣的事情;-)。
然后你可以告诉用户像在 shell 中一样进行引用:
#!/bin/posh
CMDLINE="quiet union=aufs wlan=FOO"
f() {
while test x"$1" != x
do
case $1 in
union=*) echo ${1##union=}; shift;;
*) shift;;
esac
done
}
f $CMDLINE
Run Code Online (Sandbox Code Playgroud)
(豪华 - 符合策略的普通 SHell,剥离了标准 POSIX 之外任何功能的 shell)
| 归档时间: |
|
| 查看次数: |
23823 次 |
| 最近记录: |