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