Библиотека сайта rus-linux.net
Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
Десять простых и мощных команд длиной в одну строку
Оригинал: "Top Ten One-Liners from CommandLineFu Explained"Автор: P.Krumins
Дата публикации: 18 March 2010
Перевод: Н.Ромоданов
Дата перевода: 28 марта 2010 г.
Мне нравится работать в командной строке. Знание командной строки позволит вам выполнять за секунды то, на что бы у вас пошли минуты или часы, если бы вы решились написать для этого программу.
В настоящей статье объясняются команды, взятые из верхней части списка (top one-liners) с сайта commandlinefu.com. Это сайт, на котором посетители дают оценку наиболее полезным командам командной строки, имеющим длину в одну строку.
Но прежде, чем перейти к объяснениям, я бы хотел привести список ссылок на несколько моих недавно написанных статей (статей автора оригинала статьи — прим. пер.), в которых также рассказывается об эффективном использовании командной строки:
А теперь переходим к объяснению наиболее часто используемых команд, взятых с сайта commandlinefu.
1. Запускаем последнюю команду с правами root
$ sudo !!
Мы все знаем, что делает команда sudo
- она запускает
команду от имени другого пользователя; в данном случае, она запускает
команду от имени суперпользователя (администратора), поскольку никакой
другой пользователь не был указан. Но, что действительно интересно, это
вторая часть команды — два восклицательных знака !!
. Она
определяет наличие события (event designator - определитель события).
Определитель события ссылается на конкретное событие, запомненное в списки истории выполнения команд (свойство history
). В данном случае определитель события ссылается на предыдущую команду. Запись !!
означает то же самое, что и !-1
. Значение -1
указывает на последнюю команду. В общем случае можно писать !-n
для ссылки на n-ую от конца предыдущую команду. Чтобы просмотреть все предыдущие команды, наберите history
.
Эта одностроковая команда в действительности только для оболочки Bash, поскольку определитель событий — это особенность Bash.
Я детально описал определители событий в моей статье Подробное объяснение использования свойства History командной строки в 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.
Снова смотрите мою статью Подробное объяснение использования свойства History командной строки в 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
Если вам понравились эти примеры, то вам, возможно, понравится моя статья, в которой я описываю действия со множествами (такие, как пересечение, объединение, симметрия, степень множества и т.д.), для выполнения которых используется только командная строка. Статья называется "Операции с множествами в оболочке Шелл в Unix". А поскольку у меня в оболочке шелл уже есть множества, то вскоре, возможно, напишу статью "Комбинаторика в оболочке шелл" и "Алгебра в оболочке шелл". Интересная тема для исследования. Возможно, даже напишу статью "Топология в оболочке шелл".
7. mtr – объединяем traceroute и ping
$ mtr google.com
Команда mtr, которая лучше известна как команда "Matt’s Traceroute"
("Трассировка Мэтта" — прим. пер.) объединяет в себе как команду трассировки traceroute
, так и команду пингования ping
. После каждой успешной прокладки трассы она посылает пинг-запрос на найденную машину, результатом будут выходные данные обоих команд traceroute
и ping
, которые помогут лучше оценить качество связи. Если будет определено, что пакет прошел по альтернативному маршруту, то команда покажет и это, а сохраняемые данные будут по умолчанию изменены с тем, чтобы вы в режиме реального времени знали, что происходит.
8. Находим последнюю команду, начинающуюся с "whatever", но не запускаем ее
$ !whatever:p
Еще одно использование определителей событий. Определитель события
!whatever
ищет в истории команд самую последнюю команду, которая начинаается с whatever
. Но вместо исполнения, команда просто выводится на экран монитора. Модификатор :p
указывает, что нужно выдать команду на экран вместо ее исполнения.
Эта одностроковая команда только для оболочки Bash, поскольку определители событий являются особенностью Bash.
И снова смотрите мою статью Подробное объяснение использования свойства History командной строки в 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 сохранять изображение с другого x-сервера, заменив для этого -i :0.0
на -i host:0.0
.
Если вас заинтересовало использование ffmpeg, смотрите следующие мои статьи:
PS: Работа над этой статьей настолько заинтересовала меня, что я решил написать продолжение. Так что ждите следующий раз статью "Следующие десять простых и мощных команд длиной в одну строку".