Какое различие вы делаете между «маленькой программой» и «функцией»?
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 builtin1
... но не для cat. Если есть встроенный или псевдоним, но вы вместо этого настаиваете на вызове программы, добавьте перед командой обратную косую черту:
Кроме того, команда, которая является программой в одной реализации * nix, вполне может стать встроенной оболочкой (= функция) в другой.
jamesqf
1
@jamesqf, да, в оболочку встроены стандартные инструменты, но встроенные команды не совпадают с функциями. Выполнить, например,sh -c 'type true; f() { echo x; }; type f'
@ilkkachu: Это зависит от вашего определения "так же, как". Конечно, они реализованы по-разному, но для обычного пользователя, набирающего команду, они функционально одинаковы.
jamesqf
1
@jamesqf, даже если ваш обычный пользователь не (знает, как) использовать функции, заявить, что они такие же, как встроенные, просто сбивает с толку.
ilkkachu
4
Определение functionвозвращает одиночные значения и ничего не выводит. Функции оболочки, в частности, могут очень хорошо и могут иметь выходные или другие побочные эффекты, поскольку возвращаемое значение функций настолько ограничено.
A command- это инструкция, данная пользователем, чтобы заставить компьютер что-то сделать, например, выполнить одну программу или группу связанных программ.
A program- это последовательность инструкций (то есть команд), которые передаются компьютеру и понятны центральному процессору компьютера (CPU). эти инструкции указывают, какие операции компьютер должен выполнять над набором данных.
Сказав это, functionsявляются логическим подмножеством программы. Звонок один полностью в вашем процессе. Эта commandпрограмма (или встроенная оболочка) может быть выполнена из командной оболочки. Команда реализует функции, которые выполняют задачу. Обратное не правильно.
«функция возвращает одно значение и ничего не выводит» - ну да, в математическом смысле, может быть. Но в императивных языках программирования под «функцией» обычно подразумевается просто подпрограмма, которая может делать все что угодно. А функции оболочки, в частности, вполне могут иметь выходные или другие побочные эффекты, поскольку возвращаемое значение функций настолько ограничено.
ilkkachu
@ilkkachu. Спасибо. Я обновил ответ. Пожалуйста, не стесняйтесь пересматривать ;-)
3
Я думаю, что эти определения взяты из контекста языка программирования, а не из контекста оболочки. Да, я знаю, что язык оболочки - это язык программирования, но его представление о «функции» весьма отличается от математического или компьютерного определения - в оболочке действуют все команды (будь то встроенные функции, функции, псевдонимы, программы или сценарии) и просто разные виды реализации.
Тоби Спейт
1
... * в основном * похожи; Встроенные функции могут изменять состояние самой оболочки, тогда как внешние программы не могут вызывать chdir()или setenv()в оболочке, которая для них является отдельным родительским процессом.
Чарльз Даффи
1
Я хотел бы знать, являются ли команды, которые мы вызываем в оболочке, функциями или программами?
Да.
В частности, когда вы набираете какой-то текст и нажимаете enter, оболочка должна определить:
Ответы:
Это зависит.
Команды могут делиться на несколько категорий: встроенные функции, псевдонимы, функции, исполняемые файлы (сценарии и двоичные файлы в пути поиска).
В командной строке они занимают одно плоское пространство имен, что делает возможным переопределение. Существует множество способов различать виды программ:
Мы знаем, что
f
это функция.Мы знаем, что
a
это псевдоним.Мы знаем, что
yes
это программа.Оболочка имеет
echo
встроенный…... но не для
cat
. Если есть встроенный или псевдоним, но вы вместо этого настаиваете на вызове программы, добавьте перед командой обратную косую черту:источник
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()
в оболочке, которая для них является отдельным родительским процессом.Да.
В частности, когда вы набираете какой-то текст и нажимаете
enter
, оболочка должна определить:alias
,источник