相关疑难解决方法(0)

如何测试我在终端中使用的外壳?

如何检查我在终端中使用的外壳?我在 MacOS 中使用的外壳是什么?

shell

96
推荐指数
5
解决办法
13万
查看次数

我如何*可靠*和*简单*获得当前的shell解释器名称?

我正在寻找一种简单可靠的方法来从脚本或源文件(而不是从命令行)中获取当前 shell 的名称。我本来希望这样做,$(basename "$SHELL")但是如果我的登录 shell 是zsh并且我在 some_script.sh 中有以下代码

this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
Run Code Online (Sandbox Code Playgroud)

我用 运行它bash some_script.sh,它仍然列出zsh而不是bash即使使用的解释器是/bin/bash. 我不确定为什么外壳设计者选择显示默认外壳而不是当前外壳,但这似乎是我们所坚持的。

还有一些其他稍微相似的问题(这里这里),但他们的答案在很多方面都不够。

  1. 他们经常假设用户试图找出他们当前使用的交互式 shell,但这太疯狂了。我知道我正在向哪个 shell 输入命令——我需要可以在任何地方运行的代码,以便能够确定正在使用什么 shell 。
  2. 他们经常提供几种不同的尝试——再次就像你在命令行上一样,在你学会使用 bash 之前可以随意摆弄——但我需要一件在所有上下文中都可靠的东西。
  3. 他们经常提供脚本中完全无用的东西,比如echo $0. 如上面的脚本所示,这失败了。(是的,它可以在交互式 shell 命令行中使用,但是您为什么不知道您使用的是什么 shell?)
  4. 他们有时会给出(在我有限的测试中)包含正确信息的命令,例如ps -p $$,但缺乏跨平台、跨外壳兼容的 sed/awk 命令来通过管道传递它以获取外壳名称并忽略随之而来的其他信息为骑行。
  5. 它们包括只能在几个 shell 上工作的东西,比如$BASH_VERSION和 …

shell bash zsh

12
推荐指数
2
解决办法
6012
查看次数

tcsh 和其他 shell 之间的 stderr 重定向不一致

我在 tcsh 中遇到重定向问题。

考虑以下命令:vi --versionvi --xxx。让我们假设这是在vi支持该--version选项的机器上。该选项--xxx无效,因此vim应通过stderr.

根据这个推理,2> /dev/null与这两个命令一起使用应该给出有效情况的输出,而无效情况则没有输出。

就是我在 bash、zsh、ksh 和 dash 中看到的。

$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 20 2014 16:09:17)
...
Run Code Online (Sandbox Code Playgroud)

但是,当我在 tcsh 中尝试此操作时,在这两种情况下没有输出

$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
(there is no output here)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我重定向stderr …

tcsh io-redirection stderr

9
推荐指数
1
解决办法
1万
查看次数

基于shell的'switch'

我想(即不调用)从任何shell脚本(bash的/ CSH是首要目标,但鱼的zsh,ksh和RC也将是有趣的)。

我想脚本是否可以是单个文件 - 即不是每个 shell 方言的文件。

我可以这样做吗?

我在想类似的事情:

  if shell is bash then
    # bash code here
  else
    if shell is csh then
      # csh code here
    else
      if shell is xxxsh then
        # xxxsh code here
      fi
    endif
  fi
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

csh% source my_script
bash$ . my_script
Run Code Online (Sandbox Code Playgroud)

问题是——当然,这if在每种方言中都不一样,所以我不知何故需要使用对每个 shell 都有效的语法。

编辑

检测外壳是第一步,在运行时确定脚本中的外壳做得很好。

同样重要的一步是如何引用 shell 不同部分的代码,以免混淆其他 shell。想一想:如何在 bash 部分中<<here_document包含在 bash 中合法但在任何其他 shell 中非法的所有组合中的所有字符,而不会混淆其他 shell。任何答案/链接答案都没有涵盖这一点。

shell bash tcsh zsh csh

7
推荐指数
1
解决办法
207
查看次数

使用bash后SHELL环境变量仍然指向zsh

我试图在 zsh 和 bash 之间跳转。

默认情况下,我将 zsh 作为我的 shell,我可以通过键入以下内容来了解​​这一点:

echo $SHELL 我得到 /bin/zsh

但是,我想打开 Bash,所以我输入/bin/bash; 我假设我现在在 bash 中,但是如果我回声,$SHELL我仍然会得到/bin/zsh

请问怎么了?

shell bash zsh

7
推荐指数
1
解决办法
1102
查看次数

获取正在运行的 shell 版本的 POSIX 兼容/跨 shell 方式?

是否有一种兼容 POSIX 的方法或一种适用于所有 shell 的方法来获取正在运行的 shell 的版本号?

有了你可以得到名称/二进制,所以可以正常工作,但在一个非常简单的外壳(特拉维斯-CI / Ubuntu的忠实的测试)这不工作也没有。$SHELL ps -p$$ -ocmd=$SHELL --version $(ps -p$$ -ocmd=) --versionsh

有没有一种方法或者至少是一种简短/简单的方法,它适用于大多数外壳(例如,如果您必须使用case来区分外壳)?

编辑:这仅用于打印所使用的 shell 版本,即仅用于提供信息。我希望做的返回值的东西,只是把它展示给用户。

shell bash zsh shell-script posix

5
推荐指数
1
解决办法
781
查看次数

if/then/else 手册页

我想知道是否有任何手册页记录了最基本的脚本命令(如if/then/elsewhilefor each)以及所有相关开关(如-eq-e、等)的构造-ge

shell scripting man documentation

4
推荐指数
2
解决办法
1663
查看次数

找出什么是sh

我写了一组脚本,我想成为便携式的,但我需要知道是否sh在当前平台上表示bashkshash。有明确的方法吗?

我首先想到的是检查哪个外壳具有哪个--version

$ zsh --version
zsh 5.0.2 (x86_64-apple-darwin13.0)

$ bash --version
GNU bash, version 4.3.39(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ ksh --version
  version         sh (AT&T Research) 93u+ 2012-08-01

$ dash --version
dash: 0: Illegal option …
Run Code Online (Sandbox Code Playgroud)

shell version environment-variables

3
推荐指数
1
解决办法
8690
查看次数

子shell和进程替换

抱歉,如果这是一个基本问题 - 我一直在试图解决一个更大的问题,这归结为如何调用 shell 脚本 - 直接 ( shellScript.sh) 或使用sh shellScript.sh.

这是问题的模型:

当我在 bash 上执行时:

cat <(echo 'Hello')
Run Code Online (Sandbox Code Playgroud)

我看到输出

Hello
Run Code Online (Sandbox Code Playgroud)

但是当我使用:

sh -c "cat <(echo 'Hello')"
Run Code Online (Sandbox Code Playgroud)

我看到错误:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cat <(echo 'Hello')'
Run Code Online (Sandbox Code Playgroud)

我试过转义<,()各种组合,但我在任何地方都看不到输出。我在这里缺少什么?

我的实际问题是我将 a<()作为输入参数传递给shell 脚本中的 python 脚本,虽然当我仅使用名称调用 shell 脚本时它工作正常,但如果我sh用来调用它,我会得到类似的错误我在上面显示的内容。

谢谢!

process-substitution subshell

1
推荐指数
1
解决办法
1407
查看次数

如何在不了解 shell 的情况下了解特定代码属于哪个 shell?

我开始明白这段代码是针对bashshell 的

for f in $file.docked.[0-9][0-9][0-9]
do
  mv $f $f.pdb
done
Run Code Online (Sandbox Code Playgroud)

这段代码是针对tcshshell的

foreach f ( file.docked.[0-9][0-9][0-9] )
  mv $f $f.pdb
end

Run Code Online (Sandbox Code Playgroud)

这是我在阅读参考资料后理解的。作为一名学习者,我认为这两个代码都可以在bash. 有没有办法在不完全了解不同 shell 的情况下找出特定代码可以工作的 shell。扩展有没有一种方法可以使代码在所有 shell 上工作,而与编写它的 Linux 的 shell 类型无关?

bash tcsh

1
推荐指数
1
解决办法
105
查看次数