【问题标题】:Which shell does Perl 6's shell() use?Perl 6 的 shell() 使用哪个 shell?
【发布时间】:2018-04-25 19:25:15
【问题描述】:

Perl 6 的 shell 向“shell”发送命令,但没有说明那是什么。我一直在我的机器上得到 bash,但我不知道我是否可以依赖它。

$ perl6 -e 'shell( Q/echo $SHELL/ )'
/bin/bash
$ csh
% perl6 -e 'shell( Q/echo $SHELL/ )'
/bin/bash
% zsh
$ perl6 -e 'shell( Q/echo $SHELL/ )'
/bin/bash

这在 Unix 上已经很容易了,但在 Windows 上的 cmd.exe 或 PowerShell(或 bash,如果已安装)呢?我认为它是 cmd.exe 但有文档的答案会很好。

【问题讨论】:

标签: shell raku


【解决方案1】:

看着the source,rakudo 只是在非Windows 上调用/bin/sh -c,而在Windows 上使用%*ENV<ComSpec> /c

【讨论】:

  • 那么在 Ubuntu 上应该是破折号:/bin/sh -> dash。但这是 bash。
  • 在 ubuntu 上确实是破折号。你做了什么来检查你得到了什么外壳?
  • perl6 -e 'shell( Q/echo $SHELL/ )'/bin/bash
  • @EugeneBarsky dash -c 'echo $SHELL' 在我的电脑上也提供了/bin/bash
  • perl6 -e 'shell( Q/echo $SHELL/ )'dash -c 'echo $SHELL' 都给了我一个空行,但我使用了perl6 -e 'shell "sleep 100"' 并通过ps faux 检查了进程ID,然后ls -ls /proc/the-pid/exe 给了我/proc/7162/exe -> /bin/dash跨度>
【解决方案2】:

dash(在许多系统上安装为/bin/sh),不设置$SHELL,也不应该设置。 $SHELL 不是父进程的名称;它是需要交互式 shell 时应使用的 shell 名称。

要获取父进程的名称,您可以在某些系统上使用以下命令:

echo "$0"

# Command line
perl -e'$ppid=getppid(); @ARGV="/proc/$ppid/cmdline"; CORE::say "".<>'

# Program file
perl -e'$ppid=getppid(); CORE::say readlink("/proc/$ppid/exe")'

您会发现在所有情况下都会收到/bin/sh

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2014-12-15
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2015-07-22
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多