Дифференциация пользовательских исполняемых файлов от существующих ранее исполняемых файлов

Команды как cp и ls находитесь под /bin или /usr/bin.

Гипотетически, если мы создали другой исполняемый файл того же имени, как Linux будет дифференцироваться между ними?

0
задан 25 May 2018 в 01:46

1 ответ

TL; DR: оболочка прекращает смотреть, после того как она находит, что что-то работает.


Вы спрашиваете, как Linux будет дифференцироваться между ними? Linux возможно, Вы имеете в виду ядро, которое понимает, например, магические числа, и в целом знает, как выполнить исполняемый файл.

Я оставлю ту тему другим и предположу, что Вы спрашиваете о том, что происходит, когда оболочка выполняет команду, которая существует больше чем в одной форме.


Одна причина и по-видимому та, о которой Вы спрашиваете, почему могло бы быть две команды с тем же именем, состоят в том, что два файла могут иметь то же базовое имя, например:

/usr/bin/foo
/bin/foo

Мы можем всегда дифференцировать два файла их полными путями, потому что для двух файлов в файловой системе не возможно иметь тот же полный путь. cmak.fr сделал комментарий, указывающий на это.

Если Вы устанавливаете или пишете свои собственные исполняемые файлы, Вы могли бы принять решение вставить их ~/bin или /usr/local/bin. Эти местоположения находятся в Вашем ПУТИ по умолчанию в Ubuntu. /usr/local/bin в начале ПУТИ по умолчанию:

$ grep PATH /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

и ~/bin предварительно ожидается, чтобы СОЕДИНИТЬ КАНАЛОМ, если это существует:

$ grep -A3 bin ~/.profile
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Таким образом, я заканчиваю с этим ПУТЕМ...

$ echo $PATH
/home/zanna/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

С тех пор /home/zanna/bin прибывает прежде /bin в моем ПУТИ, если я поместил названную команду chmod в ~/bin, и работал chmod, тот исполняемый файл ~/bin/chmod был бы выполнен вместо /bin/chmod, потому что оболочка прекращает смотреть, после того как она находит что-то, и если я хочу работать /bin/chmod, Я должен буду сделать точно что: введите полный путь программы, которую я хочу запустить.

Это - действительно конец истории, из которой мы не упомянули начало, потому что поиск пути является последней вещью, которую делает оболочка, когда попытка выполнить команду и наличие двух файлов с тем же именем не являются единственным путем могло быть две команды с тем же именем.

Я сюда собираюсь говорить о Bash, потому что это - единственная оболочка, с которой я довольно знаком. Насколько я знаю, другие оболочки выполнят подобные процедуры. Важно отметить, хотя это много утилит на Ubuntu звонит /bin/sh вместо Bash, и в то время как /bin/sh май символьной ссылкой на /bin/bash, по умолчанию на Ubuntu это к /bin/dash, и мог быть к любой установленной программной оболочке.

Первая команда - то, что оболочка пытается выполнить - последующие слова являются ее аргументами (который может быть опциями и не может требоваться).

Обратите внимание, что расширение псевдонима выполняется перед всеми другими расширениями на этапе повреждения команды в слова, несколько этапов перед выполнением команды. Это означает, что псевдонимы всегда имеют приоритет по другим командам, которые могут иметь то же имя.

После того, как токенизация и все расширения завершаются, перенаправления были настроены, и переменное присвоение было сделано, выполнение команды запускается.

Если первое слово содержит /, оболочка предполагает, что слово является путем и пытается выполниться (afaik, получает ядро, чтобы заставить ЦП выполнять его или называть интерпретатор для него, или если все остальное перестало работать, выполняет его как сценарий оболочки), файл в том пути. Если файл в том пути не существует, Вы добираетесь no such file or directory.

Если первое слово не содержит /, оболочка продолжит искать команду в этом порядке и выполнит первую вещь, которую это находит, и затем прекратите смотреть:

  1. Существует ли функция оболочки с этим именем?
  2. Существует ли оболочка, встроенная с этим именем?
  3. Существует ли команда в хеш-таблице с этим именем?
  4. Существует ли команда в каком-либо каталоге PATH с этим именем?

Так, поиск ПУТИ является последним средством. Обратите внимание, что ПУТЬ ищется в порядке, слева направо. Первый каталог в ПУТИ ищется перед последним, таким образом, команда в первом каталоге с тем же именем как один во втором каталоге будет выполняться, а не второй.

Обратите внимание также на это, когда Вы будете использовать sudo, это устанавливает ПУТЬ к одному определенному в /etc/sudoers как secure_path.

Если Вы устанавливаете/создаете исполняемый файл с тем же именем как существующий ранее исполняемый файл, необходимо знать, что это может влиять на другие программы, не только наполнить Вас, делают в интерактивной оболочке. Типичным примером этого является Анаконда, которая устанавливает версию Python и предварительно ожидает bin каталог для СОЕДИНЕНИЯ КАНАЛОМ. Системные программы тот вызов python и ожидайте что-то в /usr/bin мог бы повредиться, потому что они получают несправедливость python. В целом создайте исполняемые файлы с различными именами.

Определение функций оболочки и псевдонимов обычно избегает этой проблемы, потому что они только известны оболочкам, которые читают ~/.bashrc (или независимо от того, что файл определяет их), то есть, интерактивный (Bash) оболочки.

Вы видите все программы, которые могли бы быть запущены, когда Вы выполняете команду с помощью type встроенный (принятие Вас не определили псевдоним или окружают вызванную функцию type!). Выполненный с -a для наблюдения всех возможных команд с этим именем в порядке, оболочка нашла бы их.

$ type type
type is a shell builtin
$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

Таким образом, в целом, команды дифференцируются тем, как они известны оболочке и порядку, в котором оболочка пытается выполнить исполняемые вещи, о которых это знает. Чтобы знать и управлять, какая команда будет выполнена, когда будет больше чем одна возможность, необходимо понять, как оболочка, называя ее работает.


Большое спасибо Eliah Kagan для объяснения этого материала мне в чате.

3
ответ дан 29 October 2019 в 06:35

Другие вопросы по тегам:

Похожие вопросы: