Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

Десять простых и мощных команд длиной в одну строку

Оригинал: "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: Работа над этой статьей настолько заинтересовала меня, что я решил написать продолжение. Так что ждите следующий раз статью "Следующие десять простых и мощных команд длиной в одну строку".



Комментарии