Я всегда импортирую базы данных из оболочки MySql. Это не обеспечивает индикатор хода выполнения, но это действительно (быстро) прокручивает действия, которые это выполняет так, я знаю, что это работает.
# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
Поиск ПУТИ является функцией стандартной библиотеки для C в пространстве пользователя, как переменные среды в целом. Ядро не видит переменных среды кроме тех случаев, когда оно передает по среде от вызывающей стороны execve
к новому процессу.
Ядро не выполняет интерпретации на пути в execve
(это - до функций обертки такой как execvp
выполнить поиск ПУТИ) или в хижине (который более или менее перенаправляет execve
звоните внутренне). Таким образом, необходимо поместить полный путь в хижину ¹. Исходная реализация хижины была всего несколькими строками кода, и она не была значительно расширена с тех пор.
В первых версиях Unix оболочка сделала работу вызова себя, когда это заметило вызов сценария. Хижина была добавлена в ядре по нескольким причинам (суммирующий объяснение Dennis Ritchie:
Непроходимые хижины потребовали бы, чтобы любой увеличил ядро для доступа к переменным среды и процессу PATH
, или иметь ядро выполняют программу пространства пользователя, которая выполняет поиск ПУТИ. Первый метод требует добавления непропорциональной суммы сложности к ядру. Второй метод уже возможен с a #!/usr/bin/env
хижина.
¹ при помещении относительного пути он интерпретируется относительно к текущему каталогу процесса (не каталог, содержащий сценарий), который едва полезен в хижине.
Там больше продолжается, чем кажется на первый взгляд. #!
строки интерпретируются ядром Unix или Linux, #!
не аспект оболочек. Это означает это PATH
действительно не существует в то время, когда ядро решает, что выполниться.
Наиболее распространенный способ иметь дело с не знанием, который исполняемый файл работать или звонить perl
портативным способом или подобный, должен использовать #!/usr/bin/env perl
. Ядро выполняется /usr/bin/env
, который наследовал a PATH
переменная среды. env
находит (в этом примере) perl
в PATH
и использование execve(2)
системный вызов, чтобы заставить ядро работать perl
исполняемый файл.
$ strace sleep 1
execve("/usr/bin/sleep", ["sleep", "1"], [/* 99 vars */]) = 0
Преобразование в полный путь сделано оболочкой (более общий: в пространстве пользователя). Ядро ожидает имя файла / путь, к которому оно может получить доступ непосредственно.
Если Вы хотите систему, находят Ваш исполняемый файл путем просмотра переменной ПУТИ, можно переписать хижину как #!/usr/bin/env EXEC
.
Но также и в этом случае это не ядро, кто делает поиск.
strace
(преобразованный в /usr/bin/strace
в какой-то момент) с 2 аргументами.
– Alois Mahdal
08.06.2016, 00:31
execve
ни в хижине, хотя имеет мало смысла иметь относительный путь в хижине. – Stéphane Chazelas 05.06.2013, 05:28/lib64/ld-linux-x86-64.so.2
(см.ldd
вывод). Linux делает это полностью универсальным:binfmt
поддержка (начиная с 2.1.43) позволяет Вам зарегистрировать путь интерпретатора / magic-number-or-file-extension пары. У Вас может быть PE32.exe
s вызываютwine
при выполнении их класс Java и файлы банки вызываютjava
, и т.д. и т.д. – Peter Cordes 23.08.2015, 05:28