8

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

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

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

Спасибо.

9 ответов9

23

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

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

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

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

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

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

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

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

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

или как

for i in /home/mydir/*;

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

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 оболочки, но вам нужен интерфейс.

0

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

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

0
why is that I can type >ls xy* and get a proper output while
I need to escape * with a \ in find - find . -name xy\* Is
shell doing the wild card expansion for one and not for the
other executable?

Смысл экранирования '*' в вызове 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

Конечно, вы можете запустить 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 хостов или тысячи. Этот скрипт пропустит и проведет опрос, выплевывая информацию на стандартный вывод.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .