我正在阅读/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
8条答案
按热度按时间szqfcxe21#
如果需要编程测试它们是否相同,可以使用
stat
查询/bin/sh
的inode
,并与/bin/bash
的inode
进行比较。如果您只需要用眼睛看看它们是否相同,请运行
stat
命令,看看它们是否返回相同的inode
数字。wtlkbnrh2#
因为你只搜索
bin
,你可以完全绕过find
,只检查sh
和bash
是否是同一个文件的硬链接:或
这不如在所有可能性上运行
find
可靠,但这是一个良好的开端。虽然AIXfind
不支持-samefile
,但它支持-exec
,可以将其与上面的命令组合以模拟相同的功能:vulvrdjw3#
检查GNU Bash
我将以不同的方式回答您的问题,因为实际上,找出 sh 是否是GNU Bash(或其他响应
--version
标志的东西)比追踪inode更简单。还有一种边缘情况,即shell被重命名而不是链接,在这种情况下,Map链接并不能真正帮助您找到答案。例如,在macOS上询问 /bin/sh:
或者,您可以grep(或类似的)字符串
bash
来捕获退出状态。例如:当然,/bin/sh 也可以是bash或bourne shell之外的其他shell,但这超出了你最初问题的范围。但是,许多shell(如ksh和tcsh)也支持version标志,因此明智地使用
case
语句可以帮助您扩展测试,以确定实际上是哪个shell二进制文件 /bin/sh。fykwrbwg4#
正如你评论的答案所说,
-samefile
不是find
的标准特性。-inum
也不是,它根据显式给定的inode号进行搜索。但是如果你的find
支持这个,就使用它。POSIX
ls
支持-i
,它打印inode编号。如果find
没有-inum
,所有你需要做的是通过所有似是而非的文件/bin/sh
可能是一个硬链接与...虽然在此之前,你可以检查文件是否有任何其他硬链接,
ls -l
是需要显示链接的数量:当然,
/bin/sh
不需要链接到任何东西。这可能只是另一个程序。(甚至是其他文件的相同副本,尽管我认为这不太可能。fwzugrvs5#
您可以用途:
ifsvaxew6#
你也可以做
readlink -f /bin/sh
。它指向/bin/dash
。fcg9iug37#
我真的看不出这个练习有什么意义。
/bin/sh
是一个POSIX shell,bash
具有/bin/sh
不支持的POSIX标准的扩展。如果您正在编写POSIX shell脚本,请使用
/bin/sh
。如果您正在编写bash
shell脚本,请使用bash
。不要试图编写一个将与
/bin/sh
一起执行的bash
脚本,也不要试图通过编程来根据/bin/sh
(或当前解释器)所链接的内容来确定当前shell的能力。相反,应使脚本可执行,并为脚本使用正确的#!
-行。nzkunb0c8#
在Mac上,你可以只做
la /private/var/select
。输出结果如下所示。