将链接命令拆分为命令

将链接命令拆分为命令

是否有一个命令将另一个命令(可能包括也可能不包括控制运算符&&||;以及可能相关的其他命令)作为输入并将该命令分解为其“子命令”?

例如:

echo 1 && ls --invalid-option 2>/dev/null || echo 3

会被分解为:

  • echo 1
  • ls --invalid-option 2>/dev/null或者可能ls --invalid-option
  • echo 3

答案1

解析 shell 语法是巨大的工作通常并不容易完成。

但是,如果您愿意运行一次该行,那么您可以让 shell 执行此操作,方法是set -x

wsl@win10:~ $ set -x
wsl@win10:~ $ echo 1 && ls haha &> /dev/null; pwd
+ echo 1
1
+ ls --color=auto haha
+ pwd
/home/wsl
wsl@win10:~ $

正如您所注意到的,有一个警告:alias扩展(实际上是所有扩展)。

对于读者来说,提取实际的命令可能是一个有趣的课后小任务(提示:以加号和空格开头的行)。

答案2

以非常基本、有限的方法使用 sed:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE:"
head $FILE

pl " Input data file $FILE, invisibles marked:"
cat -A $FILE

pl " Results:"
sed -e 's/[      ]*&&[   ]*/\n/g' -e 's/[       ]*||[   ]*/\n/g' $FILE

生产:

-----
 Input data file data2:
one-space && next-one || last-one

one-TAB &&      next-tab        ||      last-tab

mixed-tabs-space         &&             next-mixed        ||    last-mixed

-----
 Input data file data2, invisibles marked:
one-space && next-one || last-one$
$
one-TAB^I&&^Inext-tab^I||^Ilast-tab$
$
mixed-tabs-space ^I && ^I^Inext-mixed^I  ||  ^Ilast-mixed$

-----
 Results:
one-space
next-one
last-one

one-TAB
next-tab
last-tab

mixed-tabs-space
next-mixed
last-mixed

在这样的系统中:

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
sed (GNU sed) 4.2.2

[] 包含一个制表符和一个空格,因此允许任意数量的此类空白字符。这不考虑带引号的字符串等。

最美好的祝愿...干杯,drl

相关内容