В этой главе вы познакомитесь с некоторыми улучшениями, которые вам, возможно, захочется внести в базовое приложение из главы 2. Его, быть может, самый очевидный недостаток — пользовательский интерфейс; он достаточно функционален, но не слишком элегантен. Теперь вы узнаете, как сделать более управляемым терминал пользователя, т. е. ввод с клавиатуры и вывод на экран. Помимо этого вы научитесь обеспечивать написанным вами программам возможность получения вводимых данных от пользователя даже при наличии перенаправления ввода и гарантировать вывод данных в нужное место на экране.
Несмотря на то, что заново реализованное приложение для управления базой данных компакт-дисков не увидит свет до конца главы 7, его основы вы заложите в этой главе. Глава 6 посвящена curses, которые представляют собой вовсе не древнее проклятие, а библиотеку функций, предлагающих программный код высокого уровня для управления отображением на экране терминала. Попутно вы узнаете чуть больше о размышлениях прежних профи UNIX, познакомившись с основными принципами систем Linux и UNIX и понятием терминала. Низкоуровневый доступ, представленный в этой главе, быть может именно то, что вам нужно. Большая часть того, о чем мы пишем здесь, хорошо подходит для программ, выполняющихся в окне консоли, таких как эмуляторы терминала KDE’s Konsole, GNOME’s gnome-terminal или стандартный X11 xterm.
Linux для начинающих | Терминал Linux | Основные команды
В этой главе вы, в частности, узнаете о:
□ чтении с терминала и записи на терминал;
□ драйверах терминала и общем терминальном интерфейсе (General Terminal Interface, GTI);
□ выводе терминала и базе данных
□ обнаружении нажатия клавиш.
Чтение с терминала и запись на терминал
В главе 3 вы узнали, что, когда программа запускается из командной строки, оболочка обеспечивает присоединение к ней стандартных потоков ввода и вывода. Вы получаете возможность взаимодействия с пользователем простым применением подпрограмм
для чтения из стандартного потока ввода и записи в стандартный поток вывода.
В упражнении 5.1 в программе menu1.c вы попытаетесь переписать на языке С подпрограммы формирования меню, использующие только эти две функции.
Упражнение 5.1. Подпрограммы формирования меню на языке C
1. Начните со следующих строк, определяющих массив, который будет использоваться как меню, и прототип (описание) функции
«a — add new record», «d — delete record», «q — quit», NULL,
int getchoice(char *greet, char *choices[]);
вызывает функцию
с образцом пунктов меню
int choice = 0;
choice = getchoice(«Please select an action», menu);
printf(«You have chosen: %cn», choice);
> while (choice != ‘q’);
3. Теперь важный фрагмент кода — функция, которая и выводит на экран меню и считывает ввод пользователя:
int getchoice(char *greet, char *choices[])
int chosen = 0;
int selected;
char **option;
printf(«Choice: %sn», greet);
option = choices;
while (*option)
printf(«%sn», *option);
selected = getchar();
option = choices;
while (*option)
if (selected == *option[0])
printf(«Incorrect choice, select againn»);
> while (!chosen);
return selected;
Как это работает
Написал 3D Игру в Консоли!
выводит на экран приглашение для ввода
и просит пользователя ввести первый символ выбранного пункта. Далее выполняется цикл до тех пор, пока функция
не вернет символ, совпадающий с первой буквой одного из элементов массива option.
Когда вы откомпилируете и выполните программу, то обнаружите, что она ведет себя не так, как ожидалось. Для того чтобы продемонстрировать возникающую проблему, далее приведен вариант диалога на экране терминала.
Choice: Please select an action
a — add new record
d — delete record
You have chosen: a
Choice: Please select an action
a — add new record
d — delete record
Incorrect choice, select again
Choice: Please select an action
а — add new record
d — delete record
You have chosen: q $
Для того чтобы сделать выбор, пользователь должен последовательно нажать клавиши , , , . Здесь возникают, как минимум, две проблемы; самая серьезная заключается в том, что вы получаете сообщение «Incorrect choice» («Неверный выбор») после каждого корректного выбора. Кроме того, вы еще должны нажать клавишу (или ), прежде чем программа считает введенные данные.
Сравнение канонического и неканонического режимов
Обе эти проблемы тесно связаны. По умолчанию ввод терминала не доступен программе до тех пор, пока пользователь не нажмет клавишу или . В большинстве случаев это достоинство, поскольку данный способ позволяет пользователю корректировать ошибки набора с помощью клавиш или . Только когда он остается доволен увиденным на экране, пользователь нажимает клавишу , чтобы ввод стал доступен программе.
Такое поведение называется каноническим или стандартным режимом. Весь ввод обрабатывается как последовательность строк. Пока строка ввода не завершена (обычно с помощью нажатия клавиши ), интерфейс терминала управляет всеми нажатыми клавишами, включая , и приложение не может считать ни одного символа.
Прямая противоположность — неканонический режим, в котором приложение получает больше возможностей контроля над обработкой вводимых символов. Мы еще вернемся к этим двум режимам немного позже в этой главе.
Помимо всего прочего, обработчик терминала в ОС Linux помогает превращать символы прерываний в сигналы (например, останавливающие выполнение программы, когда вы нажмете комбинацию клавиш +), он также может автоматически выполнить обработку нажатых клавиш и и вам не придется реализовывать ее в каждой написанной вами программе. О сигналах вы узнаете больше в главе 11.
Итак, что же происходит в данной программе? ОС Linux сохраняет ввод до тех пор, пока пользователь не нажмет клавишу , и затем передает в программу символ выбранного пункта меню и следом за ним код клавиши . Каждый раз, когда вы вводите символ пункта меню, программа вызывает функцию
обрабатывает символ и снова вызывает
немедленно возвращающую символ клавиши .
Символ, который на самом деле видит программа, — это не символ ASCII возврата каретки CR (десятичный код 13, шестнадцатеричный 0D), а символ перевода строки LF (десятичный код 10, шестнадцатеричный 0A). Так происходит потому, что на внутреннем уровне ОС Linux (как и UNIX) всегда применяет перевод строки для завершения текстовых строк, т. е. в отличие от других ОС, таких как MS-DOS, использующих комбинацию символов возврата каретки и перевода строки, ОС UNIX применяет, для обозначения новой строки только символ перевода строки. Если вводное или выводное устройство посылает или запрашивает и символ возврата каретки, в ОС Linux об этом заботится обработчик терминала. Если вы привыкли работать в MS-DOS или других системах, это может показаться странным, но одно из существенных преимуществ заключается в отсутствии в ОС Linux реальной разницы между текстовыми и бинарными файлами. Символы возврата каретки обрабатываются, только когда вы вводите или выводите их на терминал или некоторые принтеры и плоттеры.
Вы можете откорректировать основной недостаток вашей подпрограммы меню, просто игнорируя дополнительный символ перевода строки с помощью программного кода, подобного приведенному далее:
selected = getchar();
> while (selected == ‘n’);
Он решает непосредственно возникшую проблему, и вы увидите вывод, подобный приведенному далее:
Источник: www.redov.ru
Пиши код в терминале, как настоящий хакер
Перевод статьи Калеба Тейлора «How to code like a Hacker in the terminal».
Вы хакер. Терминал – ваш дом родной. Вы знаете, что каждое нажатие клавиш имеет значение. Если что-то эффективно менее чем на 100%, то вы готовы проводить часы, подбирая правильный инструмент, который сохранит вам секунды. Потому что дело всегда того стоит.
Но не отвлекает ли вас от работы этот постоянный поиск новых и лучших способов работать? Кто-то может с этим согласиться, но вы – вряд ли. Никакая работа не стоит того чтобы ею заниматься, если после вы не сможете прочесть коллегам лекцию о том, как вам удалось сделать это так эффективно (ну, эффективно – это не считая времени на настройку всего).
Инструменты/функционал из списка ниже должны быть известны любому хорошему хакеру.
Оболочка (zsh)
Обычный разработчик: Оболочка это оболочка. Вообще не важно, какую использовать.
Вы, хакер: Командная оболочка это сердце моей работы. Моя страсть к эффективности и функционалу не знает границ. Моя оболочка должна быть достойна настоящего хакера.
Вы живете в терминале, поэтому хотите использовать прекрасную оболочку. Вот почему вы используете zsh.
Она имеет массу особенностей:
- Автоматическое исправление команд, введенных с ошибками.
- Совместимость с bash.
- Лучшее дополнение cd с помощью .
- Раскрытие пути: cd /u/c/c/j + =cd /user/caleb/code/jarvis
- И многое другое.
Она также поставляется с отличным фреймворком для управления вашей zsh-конфигурацией: Oh My Zsh. Он включает больше 200 плагинов и больше 140 тем, с помощью которых можно добавить в ваш терминал разнообразные прекрасные функции. Маленький пример:
git – тысячи aliases и полезных функций для git.
tmux — alias и настройки для интеграции zsh с tmux.
node – добавляет команду node-docs для открытия документации сайта.
osx – несколько утилит для работы с OSX.
web-search – поиск в интернете из командной строки.
auto-suggestions – быстрые, ненавязчивые предложения команд, возникающие по мере ввода. Основываются на вашей истории команд.
Полный список плагинов можно посмотреть здесь.
Управление сессиями (tmux)
Обычный разработчик: Окей, я открыл мои файлы проекта lame_project_1. Но мне также нужно работать над boring_project_2. Также мне нужно подключиться к серверу по ssh и посмотреть логи. Подозреваю, что у меня будет бардак в терминале со всеми этими файлами/вкладками из разных проектов и в конечном итоге я потеряю над ними контроль и буду вынужден закрыть терминал и начать сначала.
Вы, хакер: я работаю над несколькими проектами одновременно, так что мне нужен инструмент, чтобы все организовать. Он должен работать на разных платформах, давать мне возможность организовывать рабочее пространство и обладать другими функциями, увеличивающими продуктивность.
Вы знаете, что разработка может стать беспорядочной. Порой приходится работать над несколькими проектами одновременно. Вот почему вам нужен tmux.
Он позволяет создавать сессии. Каждая сессия может быть кастомизирована под ваши нужды. Чтобы было легче переключаться, сессиям можно давать имена. Также их можно сохранять, чтобы в случае закрытия терминала можно было восстановить. Плюс, в этом инструменте есть собственная строка состояния, где отображаются вещи вроде времени, даты, использования CPU и пр.
А если вы не знаете, сколько CPU у вас используется на данный момент, то какой же вы хакер?
В tmux даже есть менеджер плагинов и масса прекрасных плагинов и функций, которые поднимут ваш хакинг на новый уровень.
Супер-хакерский совет: используйте tmux с fzf с помощью прекрасных скриптов для быстрого создания / удаления файлов и перемещения по ним.
Поиск (ripgrep)
Обычный разработчик: Где я определил эту константу? Я знаю, что она где-то здесь. Попытаюсь найти с помощью grep. А какие аргументы задать? Загуглю. Вот черт, теперь оно ищет по моей папке node_modules.
Хуже не бывает.
Вы, хакер: Когда я что-нибудь ищу, поиск должен быть молниеносно быстрым. Также в инструменте поиска должны быть тонкие настройки, заданные по умолчанию, чтобы игнорировать бинарные и скрытые файлы.
Вы знаете, что поиск по проекту выполняется довольно часто. Он должен быть быстрым, чтобы не отнимать ваше время. Это подразумевает вещи вроде игнорирования всего, что игнорирует ваш файл .gitignore, а также пропуск бинарных и скрытых файлов. Вот почему вам нужен ripgrep. Это как grep на стероидах.
Говоря словами разработчика программы, «Используйте ripgrep, если вам нравится скорость, фильтрация по умолчанию, меньшее количество багов и поддержка Unicode».
Fuzzy Finding (fzf)
Обычный разработчик: Помнить расположение всех файлов моего проекта, безусловно, тяжело. Думаю, придется покопаться, пока найду нужный.
Вы, хакер: мне нужна возможность искать файлы с нечеткими условиями поиска. Чтобы я мог быстро найти искомое, введя имя файла или часть пути, или и то, и другое.
Вы знаете, что вам нужна возможность не печатать больше необходимого. Поэтому вы применяете fzf – fuzzy finder общего назначения для использования в командной строке. Он может осуществлять поиск по любому списку: по файлам, истории команд, процессам, именам хостов, закладкам, git commits и т.п.
Супер-хакерский совет: псевдонимы (aliases) это отличный способ создать сокращения, которые помогут вам извлечь пользу из функционала fzf. Например, если вы хотите найти файл, а затем открыть выбранное в вашем дефолтном редакторе, вы можете добавить в конфиг вашего zsh следующее:
[code]# fo [FUZZY PATTERN] — Open the selected file with the default editor
# — Bypass fuzzy finder if there’s only one match (—select-1)
# — Exit if there’s no match (—exit-0)
fo() local files
IFS=$’n’ files=($(fzf-tmux —query=»$1″ —multi —select-1 —exit-0))
[[ -n «$files» ]] $ «$»
>[/code]
На fzf wiki есть гораздо больше примеров.
Подсказки в терминале (Spaceship)
Обычный разработчик: да какая разница, как выглядят подсказки в терминале? В них все равно нет ничего полезного для меня. Я бы просто оставил их в дефолтном состоянии.
Вы, хакер: Я хочу, чтобы мои подсказки были восхитительными. Они должны учитывать контекст. Они должны давать мне полезную информацию и быть настраиваемыми. Также было бы хорошо, если бы они соотносились с пространством.
Вы знаете, что подсказки должны быть короткими, простыми и предоставлять информацию, имеющую отношение к делу. А также они должны поражать людей своей красотой. Вот почему вы используете spaceship-prompt. Он предоставляет git/mercurial интеграцию, индикатор заряда батареи, «умное» имя хоста и пользовательские данные, номера версий для разнообразных библиотек, потрясающие значки и многое другое.
Смена директорий (z)
Обычный разработчик: Мне нужно перейти в мой проект hacker, который находится внутри папки cool, которая лежит в папке personal, которая расположена в папке code, а уж та, в свою очередь, – в домашней директории.
Вы, хакер: Мне нужно перейти в мой проект hacker.
Обычные разработчики печатают весь путь к нужной директории. А вы хакер. Вы полагаетесь на z. После установки эта программа начинает изучать, какие директории вы посещаете. Затем вы можете передать ей регулярное выражение (или просто имя директории), чтобы перейти к наиболее вероятному кандидату.
Бонусные инструменты хакера
Следующие инструменты позволят вам вывести свою хакерскую игру на новый уровень.
1. wttr.in – Есть только один правильный способ узнавать погоду.
2. Star Wars – Классные люди любят «Звездные войны». Хакеры смотрят их в терминале. (о подобные интересных штуках, которые можно делать в терминале Linux, мы писали ранее).
3. haxor-news – Если вы не читаете Hacker News, то вы вообще хакер?
4. Spotify – Используя shpotify, вы можете проигрывать музыку прямо из терминала (только OSX). Или можно использовать mopidy для чего-нибудь кроссплатформенного.
Конечно, это далеко не исчерпывающий список. У вас есть собственные любимые инструменты, повышающие эффективность работы? Поделитесь в комментариях!
Источник: techrocks.ru
[Mac OS X] Начинающим о работе в Терминале
В OS X обычный пользователь практически не сталкивается с необходимостью использовать командную строку, поскольку большинство его нужд покрывает то, что реализовано в графическом интерфейсе системы.
Другое дело, когда нужны некоторые скрытые возможности, которые недоступны из графического интерфейса. Собственно в этой рубрике мы частенько прибегаем к извлечению этих скрытых возможностей при помощи командной строки. А потому я и решил немного рассказать о программе Терминал и командной строке, а так же дать пару советов новичкам, которые позволят им ощущать себя в ней более комфортно.
Небольшое введение
Начнем с вопроса, что такое Терминал? Прежде всего, это приложение, внутри которого выполняется командный интерпретатор. Его еще часто называют интерфейсом командной строки. Он интерпретирует команды специального языка скриптов.
Пояснение слова скрипт
Правильнее «скрипт» следует называть сценарием, поскольку это одно из значений английского слова — sript. Да и фактически «скрипт» является сценарием. Но термин «скрипт» очень прочно устоялся среди программистов, а потому я немного нарушу правила русского языка и буду называть его именно – скрипт. Тем более что и само слово «сценарий» заимствовано русским языком и родным ему не является.
Языки скриптов бывают разные, но есть наиболее распространенный набор таких языков, а соответственно и их интерпретаторов.
В OS X, по умолчанию используется командный интерпретатор bash . Это улучшенный вариант интерпретатора Bourne shell, который обычно называют просто shell . И он тоже присутствует в нашей системе в виде файла /bin/sh . Правда не используется.
В настоящее время bash – фактически стандарт де-факто в большинстве Unix-подобных систем.
Так же достаточно популярен интерпретатор zsh , который в свою очередь является улучшенным bash (и он тоже есть в нашей системе), но стандартом де-факто он не стал. Возможно пока. Существует и еще целый ряд командных интерпретаторов, не получивших такого большого распространения как bash .
Найти информацию обо всех перечисленных интерпретаторах несложно в «Википедии».
Командная строка
Когда вы запускаете программу Терминал, то видите в ее окне командную строку, которая в моей системе выглядит так:
Командная строка начинается с названия компьютера (у меня он называется iMac), затем следует название текущего каталога — по умолчанию открывается домашний каталог пользователя, который в Unix-системах обозначается знаком ~ (тильда). Далее следует имя пользователя (в моем случае — gosha ), а за ним знак $ , который называется приглашением – приглашением вводить команды интерпретатору.
Вид командной строки и приглашения можно настраивать, а в минимальном виде это будет просто знак $ . Именно после знака $ и вводятся все команды интерпретатору. Это место обозначает курсор — мигающий прямоугольник (его вид тоже можно настраивать).
Примечание: в заголовке окна Терминала вы видите текущий каталог (в данном случае это домашний каталог, а потому он обозначен домиком), затем имя пользователя, затем название используемого интерпретатора (в данном случае — bash ) и размер окна в символах.
Язык скриптов bash
Командный интерпретатор bash , как я уже написал выше, интерпретирует команды специального языка скриптов. Язык скриптов достаточно несложный язык программирования, который, как и любой язык программирования, предназначен для передачи команд и данных от человека к компьютеру.
Самой простой командой этого языка является запуск программы – она состоит только из имени файла программы и, если необходимо, то и полный путь до этого файла, а так же, возможно, с последующими за именем файла ключами и параметрами, которые дают различные указания выполняемой программе.
Приведу пример. Вы хотите посмотреть содержимое текущего каталога (при запуске Терминала, по умолчанию это будет ваш домашний каталог). Для этого в системе есть программа, находящаяся в файле ls . Ее запуск в командном интерпретаторе заключается во вводе имени файла этой программы и нажатием клавиши Enter:
Небольшое, но важное пояснение
На самом деле, этот файл находится в каталоге /bin и полностью этот файл обозначается как /bin/ls . Но в интерпретаторе есть специальный механизм, позволяющий не вводить полный путь до некоторых файлов программ. Этот инструмент — переменная окружения, которая называется PATH (путь) и содержит список каталогов. Интерпретатор, получив в качестве команды имя файла, указанное ему без пути, просто ищет этот файл в каталогах, перечисленных в переменной окружения PATH . Если находит, то запускает его на выполнение, если не находит, то выводит сообщение — файл не найден.
Посмотреть содержимое переменной PATH вы можете командой:
Естественно эту переменную можно настраивать, но какой-то особой необходимости в этом у обычного пользователя не возникает, а потому я опущу этот вопрос.
Ну а теперь перейдем собственно к советам.
Совет 1 — автодополнение
При использовании командной строки очень часто приходится вводить имена файлов – обычно это файлы различных команд, и вводить имена файлов или каталогов, передаваемых в качестве параметра командам, которые необходимо набирать с указанием полного пути до них. И вот для того, чтобы не ошибиться при наборе, в bash имеется механизм, называемый автодополнением.
Примечание: в дальнейшем, для удобства, я буду называть имя файла команды просто командой. Это общепринятая практика.
Смысл этого механизма заключается в том, что когда вы начинаете набирать команду, вводите первые несколько букв и нажимаете клавишу Tab, в результате чего набор команды будет завершен автоматически. Это же работает и при наборе пути и имен файлов, передаваемых командам в качестве параметров.
Для того, чтобы понять, как это работает, приведу пример. Пусть мы хотим ввести команду diskutil . Начинаем вводить disku и нажимаем клавишу Tab, команда будет дописана автоматически – diskutil . А теперь попробуйте ввести на одну букву меньше — disk и нажать Tab — прозвучит звуковой сигнал и команда дописана не будет. Этот звуковой сигнал предупреждает нас, что есть несколько вариантов команд, начинающихся с букв disk . А вот для просмотра этих вариантов нажмите второй раз клавишу Tab и все эти варианты будут показаны:
Как видно на картинке, имеется шесть команд, название которых начинается с disk , а потому интерпретатор предлагает уточнить следующую букву. В нашем случае нужно ввести букву u , для того, чтобы интерпретатор смог понять, что нам нужна именно команда diskutil , поскольку это единственная команда, начинающаяся с букв disku и затем нажать клавишу Tab. Команда будет дописана полностью.
Попробуйте ввести только буквы di и нажать два раза клавишу Tab. Команд, начинающихся на эти две буквы, будет еще больше. А вот если бы в системе была только одна команда, начинающаяся с букв di , то после первого же нажатия клавиши Tab, она была бы дописана полностью, поскольку интерпретатору не приходилось бы выбирать из разных вариантов.
Точно так же это действует и при наборе имен каталогов и файлов, передаваемых в качестве параметров командам.
Пример. Предположим мы хотим посмотреть содержимое вашего каталога Загрузки при помощи команды ls .
И сразу небольшое отступление.
На самом деле, каталога с названием Загрузки , в вашем домашнем каталоге нет. Это программа Finder, так показывает вам название каталога Downloads . То есть фактически переводит на русский язык слово Downloads . Сделано это для удобства пользователей.
Вы можете убедиться в этом, взглянув на второй сверху снимок экрана, где мы командой ls выводили содержимое домашнего каталога. Как видите, там нет каталога с названием Загрузки , но есть каталог Downloads . Точно так же вы там не увидите каталогов с названиями Библиотеки , Документы , Изображения , Музыка , Общие , Сайты и Фильмы , которые показывает вам программа Finder как перевод с английского на русский названий каталогов: Library , Documents , Pictures , Music , Public , Sites и Movies соответственно.
Итак, вернемся к просмотру содержимого каталога Загрузки (а на самом деле Downloads ) командой ls . Нам нужно ввести название каталога в качестве параметра к этой команде. Набираем ls Dow и нажимаем клавишу Tab, получаем команду ls Downloads , в результате выполнения которой и получим содержимое каталога Загрузки ( Downloads ).
И еще одно отступление.
На самом деле в Unix -системах в этом случае вводят не ls Downloads , а ls ./Downloads . Тем самым обозначая, что каталог Downloads находится в текущем каталоге. Точка — обозначение текущего каталога. Но в реализации bash в OS X , сделано небольшое послабление пользователям и в текущем каталоге, можно ./ опускать, так как будто в переменной окружения PATH прописан текущий каталог, хотя на самом деле его там нет. Вы можете убедиться в этом, выполнив команду echo $PATH . Зачем это было сделано для меня остается загадкой, но таковы реалии OS X. Естественно можно набирать и канонически для Unix-систем – ./Downloads .
Итак, мы ознакомились с автодополнением. Этот инструмент позволяет очень быстро и безошибочно вводить команды. Между прочим, многие файловые операции (копирование, перемещение, переименование, удаление) бывают гораздо проще и их быстрее выполнить именно в командной строке, используя механизм автодополнения.
Совет 2 – история команд
Это еще один механизм, облегчающий работу в командной строке. Дело в том, что интерпретатор bash запоминает все команды, которые вы выполняли. Он сохраняет всю историю команд в скрытом файле вашего домашнего каталога с названием .bash_history . Увидеть этот файл можно при помощи команды ls с ключом -la , т.е. ls -la . Попробуйте.
Пользоваться историей команд очень просто – при помощи клавиш навигации — Стрела вверх и Стрелка вниз. Нажмите первую из них и вы увидите в командной строке предыдущую выполненную команду. Последующие нажатия этой клавиши будут последовательно выводить ранее выполненные вами команды. Соответственно вторая клавиша листает список выполненных команд в обратном направлении.
Это удобно использовать собственно для повторения выполненных команд. Но и очень удобно для их модификации. Например, в моих статьях часто встречаются команды вида defaults write … , которыми мы обычно включаем некоторые скрытые настройки OS X. А отмена включения этих настроек часто делается командой defaults delete … , которую очень просто получить, вызвав из истории предыдущую команду defaults write … и просто исправить ее на соответствующую команду defaults delete… , а не вводить ее с нуля.
Так же, если вы ввели команду с ошибкой и попытались ее выполнить, то после получения сообщения об ошибке, гораздо проще бывает не вводить команду заново, а исправить ошибку в предыдущей, вызвав ее нажатием на клавишу Стрелка вверх, а затем внеся исправления.
Надеюсь, это небольшое введение в основы мира командной строки, не слишком вас утомило.
Удачи!
Источник: appleinsider.ru