unix 如何查看/bin/sh指向的内容

rdrgkggo  于 2023-06-22  发布在  Unix
关注(0)|答案(8)|浏览(194)

我正在阅读/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
szqfcxe2

szqfcxe21#

如果需要编程测试它们是否相同,可以使用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
wtlkbnrh

wtlkbnrh2#

因为你只搜索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 '{}' ';'
vulvrdjw

vulvrdjw3#

检查GNU Bash

我将以不同的方式回答您的问题,因为实际上,找出 sh 是否是GNU Bash(或其他响应--version标志的东西)比追踪inode更简单。还有一种边缘情况,即shell被重命名而不是链接,在这种情况下,Map链接并不能真正帮助您找到答案。
例如,在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)也支持version标志,因此明智地使用case语句可以帮助您扩展测试,以确定实际上是哪个shell二进制文件 /bin/sh

fykwrbwg

fykwrbwg4#

正如你评论的答案所说,-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不需要链接到任何东西。这可能只是另一个程序。(甚至是其他文件的相同副本,尽管我认为这不太可能。

fwzugrvs

fwzugrvs5#

您可以用途:

ls -l /bin/sh
ifsvaxew

ifsvaxew6#

你也可以做readlink -f /bin/sh。它指向/bin/dash

fcg9iug3

fcg9iug37#

我真的看不出这个练习有什么意义。
/bin/sh是一个POSIX shell,bash具有/bin/sh不支持的POSIX标准的扩展。
如果您正在编写POSIX shell脚本,请使用/bin/sh。如果您正在编写bash shell脚本,请使用bash
不要试图编写一个将与/bin/sh一起执行的bash脚本,也不要试图通过编程来根据/bin/sh(或当前解释器)所链接的内容来确定当前shell的能力。相反,应使脚本可执行,并为脚本使用正确的#!-行。

nzkunb0c

nzkunb0c8#

在Mac上,你可以只做la /private/var/select。输出结果如下所示。

total 0
lrwxr-xr-x  1 root  wheel     9B Aug 24  2022 sh -> /bin/bash

相关问题