文章目录
一、linux shell #!/usr/bin/env bash和#!/bin/sh、 #!/bin/bash有什么区别
Why is #!/usr/bin/env bash superior to #!/bin/bash?
参考URL: https://stackoverflow.com/questions/21612980/why-is-usr-bin-env-bash-superior-to-bin-bash/21613044
命令解释器的位置声明,那么,当执行该脚本时,系统就知道该去哪里找这个命令解释器。
#!/usr/bin/env在PATH中搜索bash,而bash并不总是在/bin中,特别是在非Linux系统上。
通过/usr/bin/env 运行程序,用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同)
使用#!/bin/bash 场景和需求点:
当路径被硬编码在 shebang 中时,我必须使用那个解释器运行。因此,# !/bin/bash 强制我使用 bash 的默认安装版本。 BASH 脚本可能被这个系统和其他系统使用,使用非标准版本的 BASH 可能会产生不希望的效果。我很可能希望确保 bash 的稳定标准版本与我的 shell 脚本一起使用。因此,我可能希望硬编码我的事务中的路径。
总结:大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;而指定具体位置的方式#! /usr/bin/bash,在某些情况下更安全,因为它限制了代码注入的可能。(另一个缺点是,由于您没有调用显式可执行文件,因此很可能会出错,并且在多用户系统上存在安全问题(例如,如果有人设法在路径中获取名为bash的可执行文件).
从个人工作总结来看,一般写死反而比较好,应该你的脚本写法不一定兼容其他shell,为了避免不必要的麻烦,我个人建议写死,如:
#!/bin/bash
二、查看和修改当前登录的Shell
查看系统当前支持哪些shell
cat /etc/shells
[root@dev workspace]# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
[root@dev workspace]#
查看系统当前默认的shell:
echo $0
$0是shell脚本的一个特殊变量,表示当前运行脚本的名字。
[root@dev workspace]# echo $0
/bin/bash
[root@dev workspace]#
查看每个用户所使用的shell
口令文件/etc/passwd记录了每个用户所使用的shell,whoami可以查看当前用户名,结合grep过滤下即可查看当前用户所使用的shell。
cat /etc/passwd
cat /etc/passwd | grep `whoami`
注意:理解 $SHELL
不要被一个叫做 $SHELL
的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell,$SHELL
也保持不变。
就是说你要理解 $SHELL
的含义,它只是配置默认 shell 的完整路径的变量而已。
[root@dev workspace]# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
[root@dev workspace]# echo $SHELL
/bin/bash
[root@dev workspace]# /bin/sh
[\u@dev \W]$ echo $SHELL
/bin/bash
[\u@dev \W]$
修改默认的shell
chsh命令可以用来修改用户的登录shell。
chsh -s /bin/sh
chsh -s其实修改的就是 /etc/passwd 文件中和我们所登录的用户名相对应的那一行。
修改了系统默认shell之后不会立即生效,需要退出当前shell再次登录系统,修改的shell才会生效。指定的shell必须是全路径,不加会报错。