Я хотел бы знать, являются ли команды, которые мы вызываем в оболочке, функциями или программами .
Я хотел бы знать, являются ли команды, которые мы вызываем в оболочке, функциями или программами .
Ответы:
Это зависит.
Команды могут делиться на несколько категорий: встроенные функции, псевдонимы, функции, исполняемые файлы (сценарии и двоичные файлы в пути поиска).
В командной строке они занимают одно плоское пространство имен, что делает возможным переопределение. Существует множество способов различать виды программ:
$ f () { :; }
$ alias a=cat
$ which f
f ()
{
:
}
Мы знаем, что fэто функция.
$ which a
alias a='cat'
/usr/bin/cat
Мы знаем, что aэто псевдоним.
$ which yes
/usr/bin/yes
Мы знаем, что yesэто программа.
$ builtin echo ; echo $?
0
Оболочка имеет echoвстроенный…
$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1
... но не для cat. Если есть встроенный или псевдоним, но вы вместо этого настаиваете на вызове программы, добавьте перед командой обратную косую черту:
$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
sh -c 'type true; f() { echo x; }; type f'
typeпредпочтительнее whichдля почти всех целей. См. Unix.stackexchange.com/q/85249/135943
Определение functionвозвращает одиночные значения и ничего не выводит. Функции оболочки, в частности, могут очень хорошо и могут иметь выходные или другие побочные эффекты, поскольку возвращаемое значение функций настолько ограничено.
A command- это инструкция, данная пользователем, чтобы заставить компьютер что-то сделать, например, выполнить одну программу или группу связанных программ.
A program- это последовательность инструкций (то есть команд), которые передаются компьютеру и понятны центральному процессору компьютера (CPU). эти инструкции указывают, какие операции компьютер должен выполнять над набором данных.
Сказав это, functionsявляются логическим подмножеством программы. Звонок один полностью в вашем процессе. Эта commandпрограмма (или встроенная оболочка) может быть выполнена из командной оболочки. Команда реализует функции, которые выполняют задачу. Обратное не правильно.
chdir()или setenv()в оболочке, которая для них является отдельным родительским процессом.