В настоящей статье объясняются команды, взятые из верхней части списка (top one-liners)
с сайта commandlinefu.com.
Это сайт, на котором посетители дают оценку наиболее полезным командам командной строки, имеющим длину в одну строку.

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.



Оригинал: "Top Ten One-Liners from CommandLineFu Explained"
Автор: P.Krumins
http://rus-linux.net/nlib.php?name=/MyLDP/consol/oneliners.html

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 17th, 2026 10:53 pm
Powered by Dreamwidth Studios