Как увидеть, что /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

Ответы

Ответ 1

Если вам необходимо программно проверить, являются ли они одинаковыми, вы можете использовать stat для запроса inode в /bin/sh и сравнить с inode от /bin/bash.

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

Ответ 2

Так как вы все равно просматриваете 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 '{}' ';'

Ответ 3

Проверить наличие GNU Bash

Я собираюсь ответить на ваш вопрос по-другому, потому что на самом деле проще узнать, является ли sh GNU Bash (или что-то еще, что отвечает на флаг --version), чем для преследования inodes. Там также крайний случай, когда оболочка переименована, а не связана, и в этом случае ссылки на отображение не помогут вам найти ответ.

Например, для запроса /bin/sh на macOS:

$ /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, но это выходит за рамки вашего исходного вопроса. Тем не менее, многие оболочки, такие как ksh и tcsh, также поддерживают флаг версии, поэтому разумное использование оператора case может помочь вам расширить тест, чтобы точно определить, какая оболочка имеет бинарный файл/bin/sh.

Ответ 4

Как ответ, о котором вы прокомментировали, -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 с чем-либо. Это может быть просто еще одна программа. (Или даже идентичная копия какого-либо другого файла, хотя я не думаю, что это очень вероятно.)