Автор: P.Krumins
Дата публикации: 18 March 2010
Перевод: Н.Ромоданов
Дата перевода: 28 марта 2010 г. Мне нравится работать в командной строке. Знание командной строки позволит вам выполнять за секунды то, на что бы у вас пошли минуты или часы, если бы вы решились написать для этого программу.
В настоящей статье объясняются команды, взятые из верхней части списка () с сайта . Это сайт, на котором посетители дают оценку наиболее полезным командам командной строки, имеющим длину в одну строку.
Но прежде, чем перейти к объяснениям, я бы хотел привести список ссылок на несколько моих недавно написанных статей (статей автора оригинала статьи — прим. пер.), в которых также рассказывается об эффективном использовании командной строки:
1. Запускаем последнюю команду с правами root
$ sudo !!Мы все знаем, что делает команда sudo - она запускает команду от имени другого пользователя; в данном случае, она запускает команду от имени суперпользователя (администратора), поскольку никакой другой пользователь не был указан. Но, что действительно интересно, это вторая часть команды — два восклицательных знака !!. Она определяет наличие события (event designator - определитель события). Определитель события ссылается на конкретное событие, запомненное в списки истории выполнения команд (свойство history). В данном случае определитель события ссылается на предыдущую команду. Запись !! означает то же самое, что и !-1. Значение -1 указывает на последнюю команду. В общем случае можно писать !-n для ссылки на n-ую от конца предыдущую команду. Чтобы просмотреть все предыдущие команды, наберите history.
Эта одностроковая команда в действительности только для оболочки Bash, поскольку определитель событий — это особенность Bash.
Я детально описал определители событий в моей статье . К статье прилагается шпаргалка, которую можно распечатать и заглядывать в нее при использовании свойства history.
2. Обрабатываем текущий директорий по ссылке http://localhost:8000/
$ python -m SimpleHTTPServerЭто одностроковая команда запускает веб-сервер на порту 8000 с содержимым текущего каталога на всех интерфейсах (адрес 0.0.0.0), а не только для локального интерфейса localhost. Если у вас есть файл "index.html" или "index.htm", то доступ будет предоставлен к ним, в противном случае в качестве содержимого будет представлено содержимое текущего рабочего каталога.
Эта команда работает, поскольку python поставляется со стандартным модулем, называемым SimpleHTTPServer. Аргумент -m позволяет команде python искать модуль с названием SimpleHTTPServer.py везде, где он может быть размещен (указывается в sys.path и в переменной $PYTHONPATH). Как только модуль будет найден, он будет выполнен как скрипт. Если вы посмотрите на исходный код этого модуля, вы увидите, что модуль проверяет, запущен ли он как скрипт (- f __name__ == '__main__'), и, если это так, то он запускает метод test(), который запускает в текущем директории веб сервер.
Для того, чтобы использовать другой порт, укажите его в качестве следующего аргумента:
$ python -m SimpleHTTPServer 8080Эта команда запускает HTTP для всех локальных интерфейсов на порту 8080.
3. Сохранение файла, с которым вы работали в редакторе vim, без указания необходимых прав доступа
:w !sudo tee %Это происходит со мной слишком часто. Я открываю в редакторе vim файл конфигурации системы, изменяю его и только только затем обнаруживаю, что у меня нет прав для того, чтобы сохранить его. Эта односроковая команда может сохранить день. Вместо того, чтобы записывать изменения во временный файл :w /tmp/foobar, а затем перемещать временный файл в нужное место с помощью команды mv /tmp/foobar /etc/service.conf, вы теперь можете набрать в vim одностроковую команду, приведенную выше, и сохранить файл.
Вот как это работает: если вы посмотрите документацию vim (набрав в vim :he :w), вы найдете ссылку на команду :w !{cmd}, где сказано, что vim запускает команду {cmd} и передает ей в качестве стандартного ввода контекст файла. Частью этой одностроковой команды {cmd} является команда sudo tee %. Она запускает tee % с правами суперпользователя. Но, подождите, а что означает %? В редакторе vim это регистр с правами только на чтение, в котором хранится имя текущего файла! Таким образом, команда, которую будет выполнять vim, станет tee current_filename, которая будет выполнена в текущем директории независимо от того, где находится файл current_file. Так что же делает команда tee? Команда tee принимает стандартный входной поток и записывает его в файл! Иными словами она берет содержимое файла, отредактированного в vim, и записывает его в файл (с правами root)! Все сделано!
4. Переход в предыдущий рабочий директорий
$ cd -Все знают, что эта команда правильная? Тире "-" означает "предыдущий рабочий директорий". Предыдущий рабочий директорий определяется при помощи переменной среды $OLDPWD. После того, как вы воспользуетесь командой cd, будет установлено значение для переменной среды окружения $OLDPWD, а затем, когда вы наберете короткую команду cd -, она, в действительности, станет командой cd $OLDPWD и произойдет переход в предыдущий директорий.
Для того, чтобы перейти директорий, обозначаемый как "-", вы должны либо перейти в родительский директорий, а затем выполнить команду cd ./-, либо выполнить команду cd /full/path/to/- (т. е. указать полный путь к директорию "-" - прим.пер.).
5. Запуск предыдущей команды, но с заменой "foo" на "bar"
$ ^foo^bar^Это еще один определитель события. Он предназначен для выполнения быстрой подстановки. Он заменяет foo на bar и повторяет последнюю команду. Это фактически ссылка на !!:s/foo/bar/. Эта однострочная команда применяет модификатор s к определителю события !!. Как уже было рассказано в примере 1, определитель события !! ссылается на предыдущую команду. Теперь с помощью модификатора s задается подстановка (приветствуем sed) и она заменяет первое слово на второе.
Заметьте, что эта одностроковая команда заменяет в предыдущей команде только одно слово. Для замены всех слов добавьте модификатор g (g обозначает "глобальный").
$ !!:gs/foo/barЭта одностроковая команда также для оболочки Bash, поскольку определители событий являются особенностью Bash.
Снова смотрите мою статью . В ней все подробно объясняется.
6. Быстрое создание копий файла
$ cp filename{,.bak}Эта одностроковая команда копирует файл с именем filename в файл с именем filename.bak. Она работает следующим образом: Команда использует фигурные скобки для создания списка аргументов для команды cp. Фигурные скобки является механизмом, с помощью которого можно генерировать произвольные строки. В нашем одностроковом примере filename{,.bak} берется строка filename, затем берется строка filename с расширением .bak, т. е. filename.bak, и обе строки помещаются на место фигурных скобок. Получается команда cp filename filename.bak, которая копирует файл.Рассмотрим подробнее свойства фигурных скобок — с их помощью вы можете выполнять различные комбинаторные задачи. Рассмотрим следующий интересный пример:
$ echo {a,b,c}{a,b,c}{a,b,c}С его помощью генерируются всевозможные трехбуквенные строки из набора {a, b, c}:aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb cccА ниже показано, как генерировать всевозможные двухбуквенные строки из набора {a, b, c}:
$ echo {a,b,c}{a,b,c}Будет сгенерировано:aa ab ac ba bb bc ca cb ccЕсли вам понравились эти примеры, то вам, возможно, понравится моя статья, в которой я описываю действия со множествами (такие, как пересечение, объединение, симметрия, степень множества и т.д.), для выполнения которых используется только командная строка. Статья называется . А поскольку у меня в оболочке шелл уже есть множества, то вскоре, возможно, напишу статью "Комбинаторика в оболочке шелл" и "Алгебра в оболочке шелл". Интересная тема для исследования. Возможно, даже напишу статью "Топология в оболочке шелл".
7. mtr – объединяем traceroute и ping
$ mtr google.comКоманда mtr, которая лучше известна как команда "Matt’s Traceroute" ("Трассировка Мэтта" — прим. пер.) объединяет в себе как команду трассировки traceroute, так и команду пингования ping. После каждой успешной прокладки трассы она посылает пинг-запрос на найденную машину, результатом будут выходные данные обоих команд traceroute и ping, которые помогут лучше оценить качество связи. Если будет определено, что пакет прошел по альтернативному маршруту, то команда покажет и это, а сохраняемые данные будут по умолчанию изменены с тем, чтобы вы в режиме реального времени знали, что происходит.
8. Находим последнюю команду, начинающуюся с "whatever", но не запускаем ее
$ !whatever:pЕще одно использование определителей событий. Определитель события !whatever ищет в истории команд самую последнюю команду, которая начинаается с whatever. Но вместо исполнения, команда просто выводится на экран монитора. Модификатор :p указывает, что нужно выдать команду на экран вместо ее исполнения.
Эта одностроковая команда только для оболочки Bash, поскольку определители событий являются особенностью Bash.
И снова смотрите мою статью . В ней все подробно объясняется.
9. Копируем ваш открытый ключ на удаленную машину для идентификации по открытому ключу
$ ssh-copy-id remote-machineЭта одностроковая команда копирует ваш открытый ключ, который вы создаете с помощью команды ssh-keygen (либо файл identity.pub версии SSH v1, либо файл id_rsa.pub версии SSH v2) на удаленную машину remote-machine и запоминает его там как файл ~/.ssh/authorized_keys. В результате гарантируется, что в следующий раз при попытке войти в эту машину вы будете использовать идентификацию по открытому ключу (обычно называемую "идентификацией без пароля") вместо обычной идентификации по паролю.
Если вы хотите это сделать по-своему, то для этого потребуется выполнить следующие шаги:
your-machine$ scp ~/.ssh/identity.pub remote-machine: your-machine$ ssh remote-machine remote-machine$ cat identity.pub >> ~/.ssh/authorized_keysЭта одностроковая команда избавит от набора сразу трех команд. На самом деле я недавно узнал, что вместо трех строк все можно сделать с помощью одной следующей команды:
your-machine$ ssh remote-machine 'cat >> .ssh/authorized_keys' < .ssh/identity.pub
10. Записываем видео с рабочего стола linux
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpgПо чистой случайности я так много работаю видео с помощью ffmpeg, что и без руководства знаю, что делает эта команда.
Обычно ffmpeg описывают как команду, у которой масса параметров, а последний параметр — выходной файл. В нашем случае этими параметрами являются -f x11grab -s wxga -r 25 -i :0.0 -sameq, а выходной файл - /tmp/out.mpg.
Выясним, что означают параметры:
- -f x11grab указывает ffmpeg использовать в качестве входного формата формат x11grab. Фреймбуфер X11 имеет специальный формат, в котором представлены данные, и этот параметр позволяет ffmpeg правильно их декодировать;
- -s wxga указывает ffmpeg использовать разрешение wxga, что означает размер изображения 1366×768. Это странное разрешение, я бы записал -s 800x600;
- -r 25 задает скорость записи в 25 кадров в секунду;
- -i :0.0 указывает, что в качестве входного видеофайла используется X11 дисплей 0.0 данного компьютера;
- -sameq позволяет сохранить исходное качество входного потока. Лучше сохранить качество, а потом выполнить дополнительную обработку.
Если вас заинтересовало использование ffmpeg, смотрите следующие мои статьи:
Немає коментарів:
Дописати коментар