1

dubin пишет:

Ну вот, теперь вопрос - как запустить любую программу из консоли?

Встречный вопрос, Татьяна Викторовна, а Вы какие программы хотите запустить из консоли?

Дело в том, что запуск программ из консоли он не сложнее, чем это же делается в Виндовз.

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

Под консолями понимается те черные экраны, на которые можно переключиться по нажатию комбинации клавиш Ctrl-Alt-F1 ... Ctrl-Alt-F6. Иначе говоря, система предоставляет изначально шесть символьных (текстовых) консолей и одну графическую консоль. Итого всего семь. На седьмую, графическую консоль можно переключиться по нажатию Ctrl-Alt-F7.

Если быть более точным, то из графической консоли на любую символьную преключаются по Ctr-Alt-Fx, а вот обратно, с символьной консоли на графическую, можно по Ctrl-F7, т.е. клавишу Alt можно не нажимать. Точно так же (по Ctrl-Fх) можно прыгать между символьными консолями. Я же сказал, нажимать Ctrl-Alt-Fx везде -- только лишь потому, что это легче запомнить.

Далее. Кроме этих семи локальных консоолей, система предоставляет практически неограниченное количество удаленных консолей. Удаленная консоль -- это экран + клавиатура, которые могут находятся в любой точке планеты. Я Вам это как раз и демонстрировал: я подключился к своему рабочему компу с одного из компов в Вашем классе. Еще раз. Таких удаленных подключений может быть очень много.

Кроме этих семи локальных и неограниченного числа удаленных консолей, система также предоставляет практически неограниченное количество псевдоконсолей, которые всегда существуют только "на теле" графической консоли. Это -- есть псевдотерминалы. Вы их можете запустить через главное меню:

Приложения / Стандартные / Терминал


Идем далее. Я думаю, что Вы уже знаете, что существуют два вида программ (на самом деле их более чем два, но об этом потом как-нибудь расскажу): консольные программы и графические программы.

Из псевдоконсоли (-ей) можно запускать оба типа программ. Если программа консольная, то она будет работать в псевдоконсои. Если программа графическая, то на экране (в графической консоли) откроется еще одно окно -- собственно, окно этой программы.

В символьных консолях и удаленных символьных консолях можно запускать, как Вы уже догадались, только консольные программы. Графическая программа не заработает, т.к. для ее работы графическая среда -- отсутствует. (Тут мне следует сделать оговорку, что существуют еще и удаленные графические консоли. Но об этом я расскажу намного, на много позже.)


Итак, переходим к вашему вопросу "Как запустить программу?"

Программа запускается элементарно -- нужно набрать ее имя и нажать клавишу Enter. Например, я нахожусь в псевдоконсоли и мне нужно запустить графический редактор gedit. Для этого я набираю в командной строке (командная строка -- это часть консоли, но это не весь экран или все окно, как это принято в Виндовз! Уловите разницу в понятиях!)

alex@zhevak:~$ gedit

эту часть строки "alex@zhevak:~$" набирать, разумеется, не надо. На Вашем компе она будет какая-то другая. нужно набрать только слово gedit . К стати, Вы помните про клавишу табуляции?

После нажатия на Enter, консоль перестанет реагировать на команды, хотя и будет отображать символы нажимемых клавишь, а на экране появится окно редактора.

После закрытия редактора, управление вновь вернется к консоли. Консоль снова сможет принимать Ваши команды.

Но если при вызове редактора Вы в конце команды укажите знак амперсенда &, то консоль, породив новы процесс, продолжит слушать команды пользователя. У Вас будет два параллельно работающих процесса: сама консоль и редактор

alex@zhevak:~$ gedit &

Теперь же, что касается программ, которые находятся в текущем директории -- почему они не запускаются так просто, как в Виндовз?

Во многих операционных системах есть такое понятие как переменные окружения. Это такие переменные, которые определяют как будет выглядеть в символьной консоли подсказка ввода (например, "alex@zhevak:~$"), имя домашнего директория пользователя, название учетной записи, текущая кодировка, имя программы-редактора, который будет использоваться по умолчанию и т.д. Эти переменные, "окружают" каждую программу. Т.е. у каждой программы есть целый блок этих переменных.

Пока программа лежит на диске в виде исполняемого файла -- это просто файл. Но если мы попытаемся запустить программу, то система снабжает ее этим блоком переменных.

Переменных окружения очень много. Среди этих переменных окружения есть переменная -- PATH. В этой переменной перечислены пути, где система будет искать заданную в консоли команду или программу.

Например, мы набрали команду gedit... Что такое gedit? gedit -- это исполняемый файл. Я сказала -- файл. Отлично! Значит он существует, значит он где-то находится. Вопрос -- где? В файловой системе тысячи директориев. Где его искать? Если искать по всем-всем директориям, то мы потеряем не только время, но и вообще интерес к такой операционной системе.

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

Давайте посмотрим, что у нас записано в переменной PATH. Делается это с помощью команды echo. Вот, что получилось у меня на компе:

alex@zhevak:~$ echo $PATH
/home/alex/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Моя переменная описывает несколько путей, они разделяются знаком двоеточия (:). В Виндовсе пути разделяются знаком точка с запятой (;).

(Меня это по началу несколько коробило, но потом я понял, что это не имеет принципиального значения --чем разделять, хоть запятыми. Другое дело, что символ двоеточия в Виндовз занят для отделения имени диска от названия папок. Хотя я ушел в сторону от темы.)

Вот пути в моей переменной, каждый путь я написал в отдельной строчке:
/home/alex/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

Это значит, что когда я набираю gedit и нажимаю клавишу Enter, то система начинает поиски файла сначала в директории /home/alex/bin. Не найдя его там, система переходит к поиску в директории /usr/local/sbin. И так далее, пока не найдет указанный файл или не закончатся пути в переменной PATH. Во втором случае чичтема сообщит, что она не смогла найти заданную команду.

А теперь, внимание -- фокус! В системе Виндовз, поиски заданного файла (программы) начинаются с текущего директория. Если в нем нет файла, Виндовз переходит к поиску в директориях, которые казаны в переменной PATH. Линукс не делает немного по другому. Линукс вообще не ищет файл в текущем директории. Ни до, ни после поисков по путям из PATH.

Конечно, Линукс можно "подогнать" под Венду и сделать из него такое же дырявое ведро, но спрашивается -- зачем? А делается это очень просто. Нужно просто указать, что бы Линукс начал поиски с текущего директория. Помните, как обозначается в файловой системе текущий директорий?

Две точки (..) -- родительский директорий, одна точка (.) -- текущий. Значит, для того что бы сломать Линукс и сделать из него Венду, нам нужно в переменной PATH указать путь -- . (точка).

Т.е. моя переменная будет выглядеть так

.:/home/alex/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Но это, я еще раз подчеркну, -- не UNIX-way. Это плохая идея.

Чтобы осознанно запускать программы из текущего директория нужно всего лишь предварять имя файла названием текущего директория. Вот, как мне нужно написать команду, чтобы запустить программу myprog из текущего директория

./myprog

Всего лишь два символа. Неужели Вы согласны променять их на безопасность?

Live Free or Die