【问题标题】:Bash: parse shell command stringBash:解析shell命令字符串
【发布时间】:2021-03-23 11:59:42
【问题描述】:

给定一个 shell 命令字符串 (ls a\ b "c d" $f),是否可以 bash 将其解析为一个数组,最好是 bash 本身会在所有扩展之后看到它,就在执行之前 (([0]=ls [1]='a b' [2]='c d' [3]=<value of $f>))? IE。 REPL 的 read() 部分。

我想写一个自定义的bind -x函数,我需要解析当前的READLINE_LINE。我试过read -a,但这只需要处理反斜杠(例如"a b"被分成<"a><b">

【问题讨论】:

  • 嵌套命令呢,比如c1 $(c2)?
  • 如果你必须使用 bash,precmd/preexec 怎么样?
  • 感谢指点!嵌套命令应解析为令牌列表('c1' '$(' 'c2' ')' )。嗯,我应该修改问题。

标签: bash shell parsing readline


【解决方案1】:

希望你可以使用下面的代码

#!/usr/bin/env bash
parse(){
    declare -g cmd
    local i
    for i in $(seq 1 $#); do
        cmd[$((i-1))]="${!i}"
    done
    declare -p cmd
}
touch "a b" "c d" "e"
f="e"
trap 'eval "parse $BASH_COMMAND"; trap -- DEBUG' DEBUG
ls a\ b "c d" $f
declare -p cmd

【讨论】:

  • 这行得通。你也可以for i; do cmd+=( "$i" ); done BTW。但是,当然,eval 将在命令行上运行嵌入在 $( ) 中的任何命令,所以我有第二个想法——也许我只需要一个在非转义空格上正确拆分的解析器
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 2016-12-10
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2019-07-07
  • 1970-01-01
相关资源
最近更新 更多