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

8

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

AymenTM
источник
1
Какое различие вы делаете между «маленькой программой» и «функцией»?
JdeBP
Вы можете вводить команды в программу оболочки, которые позволяют программировать оболочку для работы и принимать команды, используя функции, с помощью которых оболочка была запрограммирована, для управления другими программами из функций оболочки.
txtechhelp

Ответы:

15

Это зависит.

Команды могут делиться на несколько категорий: встроенные функции, псевдонимы, функции, исполняемые файлы (сценарии и двоичные файлы в пути поиска).

В командной строке они занимают одно плоское пространство имен, что делает возможным переопределение. Существует множество способов различать виды программ:

$ 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
PHG
источник
3
Кроме того, команда, которая является программой в одной реализации * nix, вполне может стать встроенной оболочкой (= функция) в другой.
jamesqf
1
@jamesqf, да, в оболочку встроены стандартные инструменты, но встроенные команды не совпадают с функциями. Выполнить, например,sh -c 'type true; f() { echo x; }; type f'
ilkkachu
5
Обратите внимание, что в целом typeпредпочтительнее whichдля почти всех целей. См. Unix.stackexchange.com/q/85249/135943
Wildcard,
@ilkkachu: Это зависит от вашего определения "так же, как". Конечно, они реализованы по-разному, но для обычного пользователя, набирающего команду, они функционально одинаковы.
jamesqf
1
@jamesqf, даже если ваш обычный пользователь не (знает, как) использовать функции, заявить, что они такие же, как встроенные, просто сбивает с толку.
ilkkachu
4

Определение functionвозвращает одиночные значения и ничего не выводит. Функции оболочки, в частности, могут очень хорошо и могут иметь выходные или другие побочные эффекты, поскольку возвращаемое значение функций настолько ограничено.

A command- это инструкция, данная пользователем, чтобы заставить компьютер что-то сделать, например, выполнить одну программу или группу связанных программ.

A program- это последовательность инструкций (то есть команд), которые передаются компьютеру и понятны центральному процессору компьютера (CPU). эти инструкции указывают, какие операции компьютер должен выполнять над набором данных.

Сказав это, functionsявляются логическим подмножеством программы. Звонок один полностью в вашем процессе. Эта commandпрограмма (или встроенная оболочка) может быть выполнена из командной оболочки. Команда реализует функции, которые выполняют задачу. Обратное не правильно.


источник
10
«функция возвращает одно значение и ничего не выводит» - ну да, в математическом смысле, может быть. Но в императивных языках программирования под «функцией» обычно подразумевается просто подпрограмма, которая может делать все что угодно. А функции оболочки, в частности, вполне могут иметь выходные или другие побочные эффекты, поскольку возвращаемое значение функций настолько ограничено.
ilkkachu
@ilkkachu. Спасибо. Я обновил ответ. Пожалуйста, не стесняйтесь пересматривать ;-)
3
Я думаю, что эти определения взяты из контекста языка программирования, а не из контекста оболочки. Да, я знаю, что язык оболочки - это язык программирования, но его представление о «функции» весьма отличается от математического или компьютерного определения - в оболочке действуют все команды (будь то встроенные функции, функции, псевдонимы, программы или сценарии) и просто разные виды реализации.
Тоби Спейт
1
... * в основном * похожи; Встроенные функции могут изменять состояние самой оболочки, тогда как внешние программы не могут вызывать chdir()или setenv()в оболочке, которая для них является отдельным родительским процессом.
Чарльз Даффи
1

Я хотел бы знать, являются ли команды, которые мы вызываем в оболочке, функциями или программами?

Да.

В частности, когда вы набираете какой-то текст и нажимаете enter, оболочка должна определить:

  1. ан alias,
  2. функция,
  3. встроенная команда,
  4. исполняемый файл.
RonJohn
источник