以各种方式引用时如何正确转义bash变量

克里斯·斯特里琴斯基

我有以下代码:

set -o xtrace
openDirectory ()
{
    lxterminal --command="zsh -c 'cd "$1"; zsh -i' "
}

# Handle argument.
if [ "$@" ]
then
  openDirectory ~/Projects/Clients/"@1"
  cd $1
fi

如果传递的参数中有空格,这将失败。

lxterminal '--command=zsh -c '\''cd /home/chris/Projects/Clients/Test' - 'Space; zsh -i'\'' '
cd Test - Space
cd: too many arguments

我怎样才能正确地逃避这个?这甚至可以用bash之类的东西来完成吗?

查尔斯·达菲

假设封闭的外壳确实是 bash (因为问题被标记),您可以使用printf -v varname %q "$var"将值的安全引用实例存储var到名为 的变量中varname,如下所示:

openDirectory()
{
    local cd_cmd cmd
    printf -v cd_cmd '%q ' cd "$1"
    printf -v cmd '%q ' zsh -c "$cd_cmd && zsh -i"
    lxterminal --command="$cmd"
}

printf '%q'计算为给定字符串的一个版本,当eval被 bash(或任何具有等效语义的 shell) 'ed时,将计算为原始文字值。

要解释为什么这样做:

  • 在上文中,包含在代码本身所有引号字符语法而不是字面:我们根据printf %q所有报价和逃逸。这是最佳实践方法:使用文字引号意味着正在生成的数据中的文字能够转义这些引号。
  • 运行 shell 指令(例如&&通过 shell 引用)将使它们成为文字数据。因此,当我们将它作为参数传递给 时,我们希望&&是文字数据而不是语法-c,而不是由远程shell 处理时的文字数据——这就是为什么它只出现在最后一次引用传递中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

以各种方式计算各种数据

可以复制context.Context变量,并使其在golang中以各种方式正常运行吗?

尝试了各种方式添加stdlib.jar后如何修复IntelliJ Idea中的NoClassDefFoundError

如何基于第一个元素以各种方式将列表配对

gparted、fdisk 和 gnome-disks 卡住(以各种方式)

C#XmlSerializer使用各种方式设置属性的对象

编写此代码的各种方式是什么?

如何正确地安排任务,以“ at”(atd)安排任务?或如何正确引用/转义bash

以正确的方式测试bash变量

管理对单个数据库的多线程访问的各种方式是什么?

使用C中的指针进行数组表示的各种方式

使用 React 编写组件的各种方式有什么区别

异步返回集合的各种方式(具有C#7功能)

以各种方式实现相同目标的关于 React 及其版本的最佳实践

BASH脚本,在sed中正确引用变量?

在 Bash 变量赋值的右侧引用时,波浪号未展开

如何以正确的方式在YAML中进行转义?

当变量具有隐藏的重新引用时,在快捷方式中引用%USERPROFILE%

从CMD使用时如何正确引用PowerShell命令路径

Bash:将变量内容作为参数插入命令替换中-如何正确引用?

使用/解析远程变量时如何正确转义单引号?

如何从环境变量中正确转义命令参数

如何正确地转义已过滤的内容变量?

如何正确vim转义变量/寄存器

如何在Bash脚本中正确转义引号?

如何在bash脚本中正确转义怪异的字符?

如何在猫鼬中构建各种相互依赖的模式或如何正确使用“引用”?

如何使用Bash引用文件中的变量?

如何在bash脚本中引用变量