如何看看/ bin / sh指向什么

我正在阅读/ bin / sh和/ bin / bash之间的差异,并且遇到了这个有趣的问题/答案: 在这里

我在标题中对这个问题做了评论,他回答了最新的答案:

你怎么知道你的系统上有什么/ bin / sh?

复杂的是,/ bin / sh可能是一个符号链接或硬链接。 如果这是一个符号链接,那么解决这个问题的便捷方式是:

> % file -h /bin/sh > /bin/sh: symbolic link to bash 

如果这是一个硬链接,请尝试

 > % find -L /bin -samefile /bin/sh > /bin/sh > /bin/bash 

我试过这个,遇到了麻烦,所以我想我会另外提一个问题。

我的结果从相关的答案:

 >file -h /bin/sh >/bin/sh: executable (RISC System/6000) or object module >find -L /bin -samefile /bin/sh >find: bad option -samefile 

我错过了什么? 我正在运行AIX:

 >oslevel -s 7100-03-03-1415 

如果需要以编程方式测试它们是否相同,则可以使用stat来查询/bin/shinode ,并与/bin/bashinode进行比较。

 if [ $(stat -L -c %i /bin/sh) -eq $(stat -L -c %i /bin/bash) ]; then ..... fi 

如果你只是需要看你的眼睛,如果他们是相同的运行stat命令,看看他们是否返回相同的inode号码。

 stat -L -c %i /bin/sh stat -L -c %i /bin/bash 

既然你只是通过bin搜索,你可以完全绕过find ,只是检查shbash是否是硬链接到同一个文件:

 test /bin/sh -ef /bin/bash 

要么

 [ /bin/sh -ef /bin/bash ] 

这并不像find所有可能性那样可靠,但这是一个好的开始。 虽然AIX find不支持-samefile ,但它确实支持-exec ,它可以与上面的命令结合使用以模拟相同的功能:

 find -L /bin -exec test /bin/sh -ef '{}' ';' 

正如你所评论的答案所说, -samefile不是find的标准功能。 -inum也不是基于明确给定的inode编号进行搜索的。 但是,如果你find支持,使用它。

POSIX ls支持-i ,它打印inode号码。 如果find -inum ,你只需要通过所有合理的文件/bin/sh就可以成为一个硬连接…

虽然在此之前,你可以检查文件是否有其他的硬链接, ls -l需要显示链接的数量:

 $ ls -l /bin/bash -rwxr-xr-x 1 root root 1029624 Nov 5 23:22 /bin/bash ^ here 

当然,不需要将/bin/sh链接到任何东西。 这可能只是另一个程序。 (甚至一些其他文件的相同副本,但我不认为这很可能)。

检查GNU Bash

我将以一种不同的方式来回答你的问题,因为它实际上比较简单的方法是找出sh是GNU Bash(还是别的响应--version标志)而不是追赶inode。 还有一种情况是shell重命名而不是链接,在这种情况下,映射链接并不能真正帮助您找到答案。

例如,在macOS上询问/ bin / sh

 $ /bin/sh --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16) Copyright (C) 2007 Free Software Foundation, Inc. 

或者,您可以grep(或类似)字符串bash来捕获退出状态。 例如:

 # Close stderr in case sh doesn't have a version flag. if sh --version 2>&- | grep -qF bash; then echo "sh is bash" else echo "sh isn't bash" fi 

当然, / bin / sh可以是除bash或原始bourne shell以外的其他一些shell,但这超出了原始问题的范围。 但是,许多shell(如ksh和tcsh)也支持版本标志,所以明智地使用case语句可以帮助您扩展测试,以确切确定哪个shell二进制/ bin / sh确实是。