Linux & Shell - Обязана ли Shell?

8

Общий вопрос новичка.

Зачем нам нужна оболочка в Linux? Как пример, когда я печатаю - найди. -name xy * - Мне сказали, что оболочка принимает этот ввод и вызывает команду find (убедившись, что подстановочный знак правильно интерпретирован и все такое). Разве это не может быть сделано без концепции оболочки? ... если оболочка отслеживает различные процессы, не может ли это быть сделано без нее?

Кроме того, почему я могу набрать> ls xy * и получить правильный вывод, в то время как мне нужно экранировать * с помощью \ in find - find. -name xy \ * Shell выполняет расширение подстановочного знака для одного, а не для другого исполняемого файла?

Спасибо.


источник
9
Использование Linux без оболочки - это все равно, что проехать Ferrari со скоростью 50 км / ч по городу. Все веселье просто уйдет.
Вава

Ответы:

23

Разве это не может быть сделано без концепции оболочки?

Ну нет. Вам нужно что-то, что интерпретирует ваше намерение и вызывает соответствующую программу. Эта вещь называется оболочкой.

РЕДАКТИРОВАТЬ: во избежание путаницы, «оболочка» не означает «интерфейс командной строки». С http://en.wikipedia.org/wiki/Shell_(computing) :

«Оболочки операционной системы обычно делятся на две категории: командная строка и графическая. Оболочки командной строки обеспечивают интерфейс командной строки (CLI) для операционной системы, в то время как графические оболочки предоставляют графический интерфейс пользователя (GUI). В этой категории основная цель оболочки - вызывать или «запускать» другую программу, однако оболочки часто имеют дополнительные возможности, такие как просмотр содержимого каталогов ».

Что касается вашего другого вопроса, оболочка выполняет расширение с подстановочными знаками для обеих команд, но когда вы ищете файлы с помощью команды find, вы хотите найти, а не оболочку, чтобы выполнить расширение, поскольку вы хотите, чтобы это было сделано в местах, которые ищет в, а не в том месте, откуда он был вызван; следовательно, вы избегаете *, чтобы прекратить расширение оболочки, так что find может увидеть это.

Лунная тень
источник
Итак, вы говорите, что в Windows кнопка «Пуск» называется оболочкой? :-)
5
Это не распространенное использование, но GUI, возможно, являются оболочками (по крайней мере, если они работают вне ядра). Кнопка «Пуск» - это просто особенность графического интерфейса ...
dmckee --- котенок экс-модератора
Кнопка «Пуск» - определенно вещь, «которая интерпретирует ваше намерение и вызывает соответствующую программу». OTOH, оболочку Linux можно назвать функцией TUI (текстовый интерфейс пользователя).
11
@Paul: Explorer, программа, которая предоставляет кнопку запуска, является оболочкой Windows. На самом деле, это оболочка для Windows; это можно заменить.
лунная тень
1
Да, кнопка запуска может рассматриваться как оболочка. Не интерактивная оболочка, а оболочка тем не менее. Обычно, когда кто-то говорит «оболочка», он подразумевает интерактивную подсказку (например, командная строка в Windows - это традиционная оболочка)
5

Конечно, вы можете делать все через графический интерфейс. Windows 'Find Files (из XP и более ранних версий) является чем-то вроде GUIsh-эквивалента введенной вами команды.

Теперь, почему пользователям UNIX (и Linux) нравится shell? Потому что вы можете взять вывод, передать его в другую программу и получить другой вывод. Например:

find | grep burek

Это две команды, findи grepодна подпитывает другую. findвыводит список всех файлов в текущей и всех дочерних папках, по одной на строку, и grepвыводит только те строки, которые в них содержатся burek.

Теперь есть и другие, более сложные вещи, такие как:

ls -R | sort | uniq

ls -Rвыводит список файлов в текущей и дочерней папках и sortсортирует выходные данные. uniqтогда дает нам только уникальные линии.

Теперь, хотя вы можете кодировать все это в GUI, вы можете быстро делать такие сложные вещи с помощью командной строки, что вы не можете обычно делать с GUI, если вы не напишите свой собственный. В этом случае быстрее просто набрать его в командной строке, не так ли?

Итог: если вы спросите это, вам это не нужно. Командная строка бесполезна для вас как обычного пользователя. Тем не менее, командная строка отлично подходит системным администраторам, разработчикам и тем, кто хочет быстро и быстро возиться со своим компьютером.

Иван Вучица
источник
1

Да, вы можете запустить команду find без оболочки - вам понадобится какая-то программа для ее запуска, и вам понадобится какая-нибудь программа для отображения ее вывода. Часто вы используете функции оболочки, и эта команда будет нуждаться в оболочке для интерпретации намерения.

например, трубопровод, перенаправление и глобализация - это особенность оболочки, и для ее интерпретации потребуется оболочка. «find. -name myfile» не использует никаких функций оболочки и может быть запущен без оболочки. «find. -name myfile | sort> output» использует как конвейер, так и перенаправление, и вам нужна оболочка для интерпретации этого.

Что касается экранирования xy *, то есть небольшая разница, если это ввод или вывод повторного текста, оболочка будет расширять его в любом случае.

Если в текущем каталоге есть файл с именем xyz

найти . -name xy * на самом деле будет работать как find. Имя XYZ, что, вероятно, не то, что вы хотите.

Если вы найдете. -name xy * и в текущей директории нет файла, соответствующего xy *, он будет работать как find. имя xy *.

Аналогично, если в текущем каталоге нет файла, соответствующего xy *, ls> xy * создаст файл с именем xy *. Если существует один файл, соответствующий - скажем, xyz, это будет означать ls> xyz. Если есть несколько файлов, соответствующих xy *, то ls> xy * завершится ошибкой.

Читать дальше http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

н.у.к.
источник
Режим чтения где?
Томи
1

Нетривиальные ОС не запускают интерпретатор командной строки в ядре.

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

Теперь нет абсолютно никакой необходимости в оболочке для работы , как в Unix оболочки, но делать нужно интерфейс.

dmckee --- котенок экс-модератора
источник
1

Чтобы ответить на ваш второй вопрос ... оболочка будет пытаться расширить все, что может, когда только сможет, если только вы не предотвратите это. Экранирование * предотвращает расширение, которое обычно необходимо для команды поиска.

Чтобы не отвечать на вопрос вопросом, как вы узнали бы, была ли команда ls перечислять файлы из-за расширения командной строки или потому что команда ls законно искала список каталогов из файловой системы? Например, я мог бы написать оболочку для цикла следующим образом:

for i in $(ls /home/mydir);

или как

for i in /home/mydir/*;

в итоге они приводят к одному и тому же набору.

KFro
источник
0
почему я могу набрать> ls xy * и получить правильный вывод
Мне нужно сбежать * с \ в найти - найти. имя xy \ * есть
оболочка делает расширение подстановочного знака для одного, а не для
другой исполняемый файл?

Смысл экранирования '*' в вызове find состоит в том, чтобы предотвратить расширение оболочки оболочкой. Экранируя его, вы гарантируете, что find видит аргументы: ".", "-Name", "xy *". Если вы не экранировали '*', команда find увидела бы ".", "-Name", "xya", "xyz" (при условии, что оболочка расширяет "xy *" до "xya xyz", что произойдет, если только файлы, начинающиеся с xy - это xya и xyz). Таким образом, ответ на ваш вопрос - нет, оболочка не расширяет «*» в вашем вызове find, потому что вы явно просили его не экранировать.

Уильям Перселл
источник
0

Shell в Linux - это удобный и общепринятый способ взаимодействия с файловой системой в Linux и запуска команд с аргументами и относительно переменных среды. Он предоставляет множество полезных функций, например, связывает вывод одного процесса со входом другого, перенаправляет потоки ввода / вывода в / из файлов, FIFO и т. Д. Оболочка - это хороший способ легко объединить несколько небольших программ, каждая из которых делать относительно небольшую задачу, чтобы обеспечить что-то полезное. Некоторые из этих программ (например, find и ls) были разработаны для работы с ними в оболочке.

Чтобы понять расширение, просто помните, что слово (ограниченная пробелом последовательность буквенно-цифровых символов и -, и некоторых других символов), если оно содержит символы *или ?символы шаблона, не экранируется и не помещается в кавычки ( ") или апострофы ', заменяется серией разделенных пробелами слов с именами файлов, которые соответствуют шаблону. Таким образом, если бы у вас было одно слово со звездочкой, после раскрытия у вас будет ноль, одно или несколько слов, которые будут рассматриваться bash как несколько аргументов. Вот особый дизайн lsкоманды: она идеально подходит для этой схемы, когда используется ls foo*для отображения всех файлов, начинающихся с «foo»! Это расширяется в нечто вроде

ls foobar boobaz

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

Но это в основном вопрос философии. В других системах все появляется из кнопки «Пуск» и панели задач. Некоторым пользователям это нравится. Некоторые пытаются установить подобную Linux оболочку в такие системы. Это дело вкуса, но для программирования простых скриптов, которые работают с файлами, оболочка чрезвычайно удобна.

П Швед
источник
0

Для интерактивных команд оболочка может быть заменена на GUI.

Но ключевым моментом оболочки является то, что это язык сценариев: вы можете создавать целые программы, которые выполняются в определенных ситуациях (загрузка, открытие сеанса, каждый день, ...). Эта функция не может быть заменена другими инструментами.

mouviciel
источник
И, конечно, вы можете запланировать сценарии оболочки сcron
Wuffers
0

Конечно, вы можете запустить Linux и никогда не использовать оболочку. Многие стандартные дистрибутивы Linux предлагают домашнему пользователю именно то, что ему нужно, если он просто хочет проверить Facebook, посмотреть фотографии и отправить электронную почту.

У Linux много плюсов, но оболочка, вероятно, лучшая. Оболочка допускает перенаправление ввода / вывода. Это то, о чем говорят люди, когда ссылаются на каналы («|»). Например:

Я хочу подключиться к списку машин и провести опрос о том, где существует учетная запись пользователя:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

В hostnames.txt может быть 0 хостов или тысячи. Этот скрипт пропустит и проведет опрос, выплевывая информацию на стандартный вывод.

Сценарии могут стать очень креативными. Я могу использовать символы "/ >>" для перенаправления ввода / вывода из и в файлы. Я мог бы просмотреть все эти машины в приведенном выше сценарии, вывести имя сервера с любого, у которого есть пользователь, в файл, а затем выполнить другой сценарий, который подключается и выполняет некоторую задачу для учетной записи пользователя (блокировка / разблокировка / сброс pw / удалить / добавить группу / и т.д.).

Учить. Для. Сценарий. знак равно

HayekSplosives
источник