我正在阅读/ 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/sh
的inode
,并与/bin/bash
的inode
进行比较。
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
,只是检查sh
和bash
是否是硬链接到同一个文件:
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
链接到任何东西。 这可能只是另一个程序。 (甚至一些其他文件的相同副本,但我不认为这很可能)。
我将以一种不同的方式来回答你的问题,因为它实际上比较简单的方法是找出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确实是。