我读到终端只不过是 shell,而 Unix 提供了不同风格的 shell:
kin*_*ilo 621
您可以在终端中键入以下命令以查看您使用的是哪个 shell:
echo $0
Run Code Online (Sandbox Code Playgroud)
如果您使用bash ( Bourne Again Shell ) 终端,结果将类似于以下内容:
-bash
Run Code Online (Sandbox Code Playgroud)
hee*_*ayl 170
要查找默认环境中的 shell,您可以检查SHELL
环境变量的值:
echo $SHELL
Run Code Online (Sandbox Code Playgroud)
要查找当前 shell 实例,请查找具有当前 shell 实例的 PID 的进程(shell)。
要查找当前 shell 实例的 PID:
echo "$$"
Run Code Online (Sandbox Code Playgroud)
现在找到具有PID的进程:
ps -p <PID>
Run Code Online (Sandbox Code Playgroud)
把它放在一起:
ps -p "$$"
Run Code Online (Sandbox Code Playgroud)
the*_*wla 42
$SHELL
为您提供默认外壳。
$0
给你当前的外壳。
例如:我将 bash 作为我的默认 shell,用于我的终端应用程序。但是对于我的 iTerm2 应用程序,我在窗口打开时使用命令:/bin/ksh
.
所以我
$0
给了我/bin/ksh
iTerm2。
$SHELL
给我/bin/bash
iTerm2。
$0
,在终端上$SHELL
给我/bin/bash
Eva*_*enn 18
其他答案往往使用特定于 shell 的功能,但我们试图发现我们使用的是哪个 shell,因此他们假设了问题的答案。例如,没有一个答案适用于鱼。
sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p
Run Code Online (Sandbox Code Playgroud)
而是在调用 sh 时使用 $$ 语法,但是我们正在寻找 PPID 而不是 PID。使用 PPID 查找 cmd。
sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'
Run Code Online (Sandbox Code Playgroud)
感谢改进@muru
kos*_*kos 10
要知道哪个是您的用户的默认 shell,您可以运行:
echo "$SHELL"
Run Code Online (Sandbox Code Playgroud)
例如,如果您使用 Bash,您应该得到以下输出:
/bin/bash
Run Code Online (Sandbox Code Playgroud)
如果您没有更改任何配置,它应该是 Bash,因为 Bash 是 Ubuntu 上的默认 shell。
小智 10
原帖问了三个问题。给出的答案确实涵盖了第一个问题,“当我打开终端窗口时,默认情况下打开哪个 shell?” 他们还回答了一个没有被问到的问题,即“如何找出当前在终端中运行的 shell?” 但是,据我所知,没有人回答最初提出的第二个问题或第三个问题,即“如何检查安装了多少个外壳?” 和“如何更改我帐户中使用的外壳?”
回答“如何检查安装了多少个 shell?” 以下命令将列出所有可用的 shell:
cat /etc/shells
Run Code Online (Sandbox Code Playgroud)
例如,在 Ubuntu 18.10 的默认安装中,这给出:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
Run Code Online (Sandbox Code Playgroud)
但是,默认情况下 sh 是指向破折号的符号链接,而 rbash 使用选项 -r(“受限 bash”)链接到 bash,因此实际上只有两个 shell,而不是上面列表中建议的四个。以下命令将显示列出的任何 shell 是否实际上是符号链接,如果是,它们链接到哪里: ls -l /bin
现在是“如何更改我帐户中使用的 shell?”的问题。假设这意味着“我如何永久地改变默认的shell,一个终端将使用”,有一个答案在这里。
您可能不想知道当前 shell 的名称(例如-bash
,来自),也不想知道默认 shell 的可执行路径(来自),而是想知道当前 shell 的可执行路径bash
(特别有用,例如,如果您有多个版本的 Bash安装)。zsh
echo $0
echo $SHELL
为此,您可以使用lsof -p "$$"
或 一些额外的编码来提取所需的信息:
lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n 1
Run Code Online (Sandbox Code Playgroud)
通过 Homebrew 安装的 Bash 的输出示例:
/usr/local/Cellar/bash/5.1.8/bin/bash
Run Code Online (Sandbox Code Playgroud)
或者对于 Zsh:
/bin/zsh
Run Code Online (Sandbox Code Playgroud)
上面的内容与 不同echo $SHELL
,既因为上面的内容适用于当前正在运行的 shell,而不是用户的默认 shell,还因为上面的内容在扩展任何符号链接后给出了可执行文件。例如,对于与上面相同的 Bash 安装,echo $SHELL
给出/usr/local/bin/bash
.
编辑 1:如果您需要在 shell 路径中允许可能存在空格字符,请lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs
改用。
编辑2:查看当前 shell 可执行文件的另一种方法,这次不使用lsof
, 是ls -l "/proc/$$/exe"
。
将其转换为不需要lsof
、允许 shell 可执行路径中可能存在空格并允许可能的别名的命令ls
,我们得到:
"$(which ls)" -l "/proc/$$/exe" | xargs -n 1 | tail -n +11 | xargs
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个版本/proc/$$
不能在 macOS 上运行,而版本可以lsof
在任何已安装的 Linux 上运行lsof
。
归档时间: |
|
查看次数: |
648945 次 |
最近记录: |