要将追逐的方法切成点,以下(起源于查尔斯·达菲(Charles Duffy(对相关问题的答复 - 请参阅他的答案(是我要求的一种可接受格式:
eval "$(
{ sed -E -e 's/^[ ]+//;' -e ':a;N;$!ba;s/n//g' | tr -d 'n'; } <<'____COMMAND'
sshfs
foo_user@fooserver.com:/sftp_folder
/var/sshfs.sandbox/server.com
-o
user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3
____COMMAND
)"
请注意,我试图将命令分为多线时有一个尾随空间:
sshfs
foo_user@fooserver.com:/sftp_folder
/var/sshfs.sandbox/server.com
-o
且没有尾随空间,对于必须在没有介入空白的情况下进行连接的选项:
user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3
串联后,命令变为:
sshfs foo_user@fooserver.com:/sftp_folder /var/sshfs.sandbox/server.com -o user=foo_user,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
但是,我被告知尾随空间是一个坏主意(再次,请参阅查尔斯·达菲(Charles Duffy(的动机答复(
因此,我想知道。有没有办法实现这三个:
- 将声明全部保持"在一起"。
- 没有落后的空间。
- 使"标题"one_answers"页脚"修复并在没有修改的其他脚本中复制粘贴。
我正在考虑使用拖延倾斜并修改解析表达式:
{ sed -E -e 's/^[ ]+//;' -e ':a;N;$!ba;s/n//g' | tr -d 'n'; }
以便我可以实现上面提到的所有三个。
您是否考虑过使用带有反弹的多行命令?这使得尾随空间清晰可见。
来自Bash手册:
3.1.2.1逃脱字符
非引用的后斜线''是bash逃生角色。它保留了 接下来的下一个角色的字面价值, 新线例外。如果出现 newline对,而后斜线 本身没有引用, newline被视为一条线延续 (也就是说,它被从输入流中删除,有效地将其删除 忽略(。
sshfs
foo_user@fooserver.com:/sftp_folder
/var/sshfs.sandbox/server.com
-o
user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3,
Backslash/Newline Trick是命令正常解析的一部分,除了忽略Newlines外,别无其他效果,因此您可以按照通常的方式使用引号。
也许在表达命令本身方面较少干净,但不需要此处的文档或对sed
的额外调用。
这就是说,Charlesduffy建议回答您的原始问题的基于数组的解决方案,从我的经验中,将命令和论点放在数组中是对许多头痛的简单有效的解决方案。有原因您不想使用此方法吗?
希望这将做您想要的。
首先,定义旨在解析标准输入收到的命令的函数。
#!/bin/bash
execute_command()
{
local -a command=()
local arg=
while IFS= read -r line
do
[[ $line =~ [[:blank:]]*(.*[^[:blank:]\])(\?)[[:blank:]]*$ ]]
if
[[ ${BASH_REMATCH[2]} ]]
then
arg+=${BASH_REMATCH[1]}
else
command+=("$arg${BASH_REMATCH[1]}")
arg=
fi
done
"${command[@]}"
}
然后,通过在每行的末端留下尾随的斜线来调用此功能,您希望以下行被视为同一参数的一部分。上面的代码不会执行任何解析,因此您不能在同一行上放两个论点(在您的示例中,您没有这样做,因此我认为对您来说是一个可接受的限制(。
execute_command <<'____COMMAND'
sshfs
foo_user@fooserver.com:/sftp_folder
/var/sshfs.sandbox/server.com
-o
user=foo_user
,reconnect
,ServerAliveInterval=15
,ServerAliveCountMax=3
____COMMAND
这为您提供了一个非常简单,可重复使用的"标头",不需要(但可以容忍(落后空间,并允许所有线路上的领先空间,同时引入尽可能少的重/怪异语法。