【问题标题】:Bypass Powershell to run zsh command绕过 Powershell 运行 zsh 命令
【发布时间】:2020-01-16 20:45:27
【问题描述】:

在 Powershell 中(pwsh) 是否可以“绕过”Powershell 不做任何事情,让底层的 shell 完成工作?

有时我需要调用从站点或其他站点复制的命令,其中包括“\”而不是“´”用于换行 - 或 Powershell 尝试插入的其他参数。

喜欢:

 <Powershell Function> kubectl get rolebindings,clusterrolebindings \                                      
  --all-namespaces  \
  -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind=="ServiceAccount")].name' | grep name

【问题讨论】:

    标签: powershell


    【解决方案1】:

    然后让底层的 shell 来完成这项工作?

    PowerShell 一个外壳,因此没有底层外壳(在某种意义上说 PowerShell 不需要从另一个外壳启动)。 但是,有平台特定的默认 shell:在 Windows 上为cmd.exe,在类 Unix 平台上为/bin/sh

    我需要调用一个命令,从站点或其他站点复制该命令

    在 PowerShell 跨平台 --% 之前,Windows PowerShell v3 中引入了 stop-parsing token,正是为了解决您的场景。

    鉴于 Windows 是当时唯一受支持的平台,行为集中在 cmd.exe - 即使在那里它也不支持 cmd.exe' s 通过行尾 ^ 字符继续行。

    更一般地说,虽然它试图模拟 cmd.exe 的行为(例如,通过扩展 % 封闭的标记,例如 %USERNAME% 作为环境变量引用)而不实际 委派给后者,它没有这样做完全

    在 PowerShell Core (v6+) 中 --% 甚至在类 Unix 平台上也受支持,但在那里几乎没有用处,因为应用了 cmd.exe 语义即使在那里;值得注意的是,'...'-quoting 不受支持。

    (请注意,PowerShell 在类 Unix 平台上模拟了一个 /bin/sh 功能,但仅没有使用
    --%globbing,即扩展*.txt 等未加引号的标记到匹配的文件路径)。


    但是,您可以显式调用平台原生 shell,例如,通过在类 Unix 平台上将复制的命令字符串传递给 sh -c使用(逐字)here-string 作为命令字符串:

    # Call the platform-native shell with a command crafted for it:
    sh -c @'
      echo This line\
        keeps going\
        with --all-namespaces and\
        with -o custom-columns='KIND:kind,NAMESPACE'
    '@
    

    不幸的是,有一个问题

    至少在 v7.2.x 之前,PowerShell 对嵌入式 " 字符的处理。在传递给外部程序的参数中(例如sh)从根本上被破坏了,需要手动将嵌入的" \-转义:

    # !! BROKEN
    sh -c @'
      echo "high noon"
    '@
    

    要完成这项工作,您必须手动 \-escape

    # WORKAROUND
    sh -c (@'
      echo "high noon"
    '@ -replace '"', '\"')
    

    有关背景信息,请参阅 this answerthis GitHub issue。 简而言之:向后兼容性问题阻止了修复默认行为,但正在进行讨论以至少允许选择正常的默认行为。

    【讨论】:

      【解决方案2】:

      我不知道。我也不知道有什么 shell 可以做到这一点,除了 Ruby,你有字符串文字运算符,使转义更容易。

      我建议在将字符串发送到外部命令之前,将 PowerShell escape sequences 转换为目标运行时转义序列。这不是 PowerShell 独有的问题,但在其他 shell 中更容易使用,因为其他运行时之间的特殊字符有更多重叠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多