在PHP中标记bash shell命令的最佳方法是什么?

问题描述 投票:1回答:1

我处于一种需要采取(可能)多字符串bash命令并将其压缩为一个不包含任何换行符或回车符的字符串的情况(但产生相同的结果,即命令语义一定不能受到影响)。

下面是一些输入和相应的预期输出的示例。

输入:

echo A
echo B

期望的输出:

echo A;echo B

输入

echo "continued
string"
echo "other"

期望的输出:

echo "continued"$'\n'"string";echo "other"

输入

cat file1 \
file2 \
file3

期望的输出:

cat file1 file2 file3

输入

for f in `pwd`/*
do
{ echo A; echo B
echo C; echo D; }
done

期望的输出:

for f in `pwd`/*; do { echo A; echo B; echo C; echo D; }; done

依此类推。显然我不能只是

preg_replace('/[\r\n]+/', ';', $input);

因为shell支持复合命令和命令列表,多行字符串,多行命令延续运算符('\')等。似乎我别无选择,只能标记输入命令并从那里去。我的bash知识中等,所以可能有些情况我错过了,也需要解决方案来处理。

是否有现有的PHP库或程序包(我搜索过packagist都没有用)可以帮助我更接近目标?如果否,那么您将如何应对这一挑战(无需编写代码,只需将手指指向正确的方向即可)。

作为一种绝望的后备,我不得不求助于移植bash源代码本身,但是我真的希望有人会建议一个快捷方式。

php bash shell tokenize
1个回答
0
投票

[尝试为bash创建解析器是一个非常雄心勃勃(且模棱两可)的项目。 Bash不断发展,并且在某些领域将边界推到了POSIX标准之外。考虑缩小项目规模-可能以Posix shell为目标(它将涵盖许多shell变体:破折号,灰烬等)。

考虑以https://pubs.opengroup.org/onlinepubs/9699919799/开头的内容,它标识了很少的报价选项。如果您认真执行这些,则您的方法(用“;”代替行尾可能会起作用)。

另一种选择是从bash语法荧光笔开始,例如vim荧光笔。 (/usr/share/vim/vimNN/syntax/sh.vim,其中NN是vim版本)。

© www.soinside.com 2019 - 2024. All rights reserved.