Документация по ОС FreeBSD Четверг, 28.03.2024, 11:38
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Shell [40]

Главная » Статьи » Программирование » Shell

30 полезных консольных команд для Unix (bash) [2010]
Мне нравится работать в командной строке. Знание командной строки позволит вам выполнять за секунды то, на что бы у вас пошли минуты или часы, если бы вы решились написать для этого программу.

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

Подробное объяснение использования свойства History командной строки в Bash
Использование в командной строке операций с множествами
Решаем головоломки от Google в командной строке
А теперь переходим к объяснению наиболее часто используемых команд, взятых с сайта 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.

11. Редактирование команды, которую вы набрали, в вашем любимом редакторе

$ command <CTRL-x CTRL-e>

Эта одностроковая команда открывает уже набранную команду command в вашем любимом текстовом редакторе для дальнейшего ее редактирования. Это удобно, если вы набираете в командной строке длинную команду. После того, как вы отредактируете команду, выйдите из редактора и выполните команду. Для того, чтобы отменить исполнение, просто сотрите команду. Если вы неудачно выйдете из редактора, то команда, которую вы набрали прежде, чем войти в редактор, будет автоматически выполнена.

На самом деле, я должен вам сказать, что это не особенность оболочки как таковой, а особенность библиотеки readline, которая используется в большинстве оболочек для обработки командной строки. Эта конкретная особенность — одновременное нажатие CTRL-x CTRL-e работает только в режиме редактирования readline emacs editing mode (чтение строки в редакторе emacs). Другим режимом является режим редактирования readline vi editing mode, (чтение строки в редакторе vi), в котором то же можно сделать, нажав ESC, а затем - v.

Режим редактирования emacs используется по умолчанию во всех оболочках, в которых используется библиотека readline. Для перехода в другой режим обычно используется команда set -o vi, которая переводит в режим редактирования с использованием редактора vi, а с помощью команды set -o emacs можно вернуться в режим редактирования с помощью редактора emacs.

Для изменения редактора выполните команду export для переменной среды $EDITOR, в которой укажите предпочитаемый вами редактор. Например, для того,чтобы по умолчанию использовался редактор pico, наберите команду export EDITOR=pico.

Еще одним способом редактирования команд в текстовом редакторе является использование команды fc, которая встроена в оболочку (по меньшей мере, она встроена в bash). Команда fc открывает в вашем любимом текстовом редакторе ранее отредактированную команду. Команду fc легко запомнить, поскольку это сокращение "fix command" ("исправить команду").

Помните команду ^foo^bar^ из статьи "Десять простых и мощных команд длиной в одну строку"? Вы можете эмулировать такую функциональность, набрав для этого fc -s foo=bar. Она заменит foo на bar в предыдущей команде и выполнит ее.

12. Очистка файла или создание нового файла

$ > file.txt

С помощью этой команды файл, имеющий название file.txt, очищается или создается новый файл с названием file.txt.

Оболочка сначала проверяет, существует ли файл file.txt. Если он существует, оболочка открывает его и полностью его очищает. Если файл не существует, оболочка создает файл и открывает его. Затем оболочка выполняет перенаправление стандартного выходного потока на дескриптор открытого файла. Поскольку в стандартном выходном потоке ничего нет, команда выполняется успешно, закрывает дескриптор файла, оставляя файл пустым.

Создание нового пустого файла называется touching и может быть сделано с помощью команды $ touch file.txt. Команду touch можно также использовать для изменения временной метки (timestamp), оставляемой командами. Однако, команда touch не стирает содержимое файла, она только изменяет доступ к файлу и в качестве временной метки устанавливает текущее время.

13. Создание туннеля между localhost:2001 и некоторая_машина:80

$ ssh -N -L2001:localhost:80 somemachine

Эта одностроковая команда создает туннель между портом 2001 вашей машины и портом 80 некоторой другой машины. Каждый раз, когда подключаетесь к порту 2001 на вашей машине, ваше соединение будет перенаправлено через туннель на порт 80 некоторой машины.

Параметр -L имеет формат -L port:host:hostport. Всякий раз, когда создается соединение к localhost:port, оно перенаправляется через безопасный канал и соединение осуществляется к host:hostport удаленного компьютера.

Параметр -N указывает, что вы не запускаете оболочку, когда подключаетесь к удаленной машине.

Для того, чтобы показать что-нибудь конкретное, приведу другой пример:

$ ssh -f -N -L2001:www.google.com:80 somemachine

Это одностроковая команда создает туннель с порта 2001 вашего компьютера на сайт www.google.com:80 через некоторый компьютер (somemachine). Каждый раз, когда вы подключаетесь к localhost:2001, ssh туннелирует ваш запрос через машину somemachine, где она пытается открыть соединение с www.google.com.

Обратите внимание на дополнительный флаг -f, ssh запускается как демон (переходит в фоновый режим), так что терминал использоваться не будет.

14. Сброс состояния терминала

$ reset

Эта команда сбрасывает состояние терминала. Вы знаете, что когда вы случайно направляете вывод двоичных данных на консоль, все на ней смешивается. Для очистки терминала используется команда reset. С ее помощью на терминал пересылается специальная последовательность байтов. Терминал интерпретирует их как специальные команды и выполняет их

Команда reset из комплекта утилит BusyBox делает следующее:

printf("\033c\033(K\033[J\033[0m\033[?25h");

Она посылает набор из кодов escape и команд CSI. Вот что они означают:

\033c: "ESC c” - посылает команду reset на терминал.
\033(K: "ESC ( K” - перезагружает таблицу вывода на экран.
\033[J: "ESC [ J” - очищает дисплей.
\033[0m: "ESC [ 0 m” - перезагружает все параметры дисплея к значениям, используемым по умолчанию.
\033[?25h: "ESC [ ? 25 h” - делает курсор видимым.

15. Пользуемся твиттером из оболочки

$ curl -u user:pass -d status='Tweeting from the shell' http://twitter.com/statuses/update.xml

Эта одностоковая команда передаст ваше сообщение на твиттер из терминального окна. Команда использует программу curl для пересылки вашего твитта по протоколу HTTP POST с использованием Twitter’s API.

Аргумент -u user:pass устанавливает логин и пароль, которые используются для аутентификации. Если вы не хотите, чтобы ваш пароль был сохранен в истории оболочки, опустите часть :pass и curl попросит вас ввести его отдельно, когда он попытается выполнить аутентификацию. И, раз мы коснулись истории оболочки, еще один способ защитить пароль от его сохранения в истории команд, это начинать команду с пробела! Например, <пробел>curl ... не сохранит команду curl в истории шелл.

Аргумент -d status='...' проинструктирует curl использовать метод HTTP POST для запросов и пошлет команду status=... в виде данных по протоколу POST.

Наконец, http://twitter.com/statuses/update.xml является API URL, куда с помощью метода POST посылаются данные.

Что касается Твиттера, то мне бы хотелось видеть вас моими фолловерами.

16. Исполняем команду в полночь

$ echo cmd | at midnight

Эта однострочная команда посылает шелл команду cmd демону at (atd) для ее исполнения в полночь (midnight).

Команда at запускает другую команду в момент времени, определяемый аргументом. Вы можете написать 4pm tomorrow для того, чтобы выполнить команду завтра (tomorrow) в четыре часа (4) вечера (pm), 9pm next year для того, чтобы выполнить команду того же самого числа в 9 часов (9) вечера (pm) в следующем году (next year), 6pm + 10 days для того, чтобы выполнить команду в шесть часов (6) вечера (pm) через 10 дней (10 days), или now +1minute для того, чтобы выполнить команду через одну минуту.

Используйте команду atq для того, чтобы выдать список всех заданий, которые запланированы на исполнение, а команду atrm — для удаления задания из очереди.

В сравнении с широко известным планировщиком cron, команда at подходит для выполнения только однократного задания. Например, вы должны использовать cron для того, чтобы выполнять задание каждый день в полночь, но для того, чтобы выполнить задание в полночь только сегодня, нужно использовать команду at.

Также знайте, что если загрузка компьютера будет более некоторого значения (для однопроцессорной системы — 0.8), то atd не выполнит команду! Этого можно избежать, если с помощью аргумента -l указать для atd большее значение нагрузки.

17. Выводим сигнал с вашего микрофона на динамики другого компьютера

$ dd if=/dev/dsp | ssh username@host dd of=/dev/dsp

По умолчанию звуковым устройством в Linux является устройство /dev/dsp. Его можно использовать как для чтения, так и для записи. Если вы читаете данные с этого устройства, то вы будете получать данные с микрофона. Если Вы пишите в это устройство, то вы будете посылать звук в динамик.

Эта однострочная команда читает аудиосигнал с вашего микрофона с помощью команды dd if=/dev/dsp (if — сокращение для input file, т.е. входного файла), а затем этот сигнал будет направлен на стандартный вход ssh. Ssh, в свою очередь, открывает соединение к компьютеру host и запускает на нем команду dd of=/dev/dsp (of — сокращение для output file, т.е. выходного файла). Dd of=/dev/dsp получает стандартный входной поток, который ssh принимает с if=/dev/dsp. В результате сигнал с вашего микрофона будет перенаправлен на динамик компьютера host.

Вы хотите, чтобы ваши коллеги испугались? Перенаправьте данные из /dev/urandom (один из генераторов случайных чисел — прим.пер.) на их динамик с помощью команды dd if=/dev/urandom (только сначала оцените возможные последствия - прим.пер.).

18. Создаем и монтируем в оперативной памяти временный раздел

# mount -t tmpfs -o size=1024m tmpfs /mnt

Эта команда создает в оперативной памяти временную файловую систему размером в 1ГБайт (size=1024m) и монтирует ее на /mnt. Флаг -t указывает тип файловой системы, а -o size=1024m задает размер файловой системы.

Если команда не работает, то проверьте, было ли скомпилировано ядро вашей системы с поддержкой файловой системы tmpfs. Если файловая система tmpfs была скомпилирована как модуль, то с помощью modprobe tmpfs удостоверьтесь, что модуль был загружен. Если же команда все-таки не работает, то вам нужно будет перекомпилировать ядро.

Для того, чтобы размонтировать диск в оперативной памяти, используйте команду umount /mnt (с правами root). Но помните, что монтирование на /mnt - не лучший вариант. Лучше смонтируйте свое устройства на /mnt/tmpfs или на что-нибудь аналогичное.

Если вы хотите, чтобы ваша файловая система увеличивалась динамически, то используйте файловую систему ramfs вместо tmpfs. Еще одно замечание: tmpfs может использовать своппинг, а ramfs — нет.

19. Сравниваем файл, расположенный на удаленной машине, с локальным файлом

$ ssh user@host cat /path/to/remotefile | diff /path/to/localfile -

Эта однострочная команда ищет различия файла /path/to/localfile, расположенного на локальной машине, с файлом /path/to/remotefile, расположенном на удаленной машине с именем host.

Команда сначала через ssh открывает соединение к host и выполняет команду cat /path/to/remotefile. Затем оболочка берет выходной поток и направлет его команде diff /path/to/localfile -. Второй аргумент "-" сообщает команде diff, что нужно сравнить файл /path/to/localfile со стандартным входным потоком. Это — все.

20. Выясняем, какая программа какой порт TCP слушает

# netstat -tlnp

Здесь все просто. Netstat является стандартной утилитой, с помощью которой можно получить информацию о сетевой подсистеме Linux. В данной конкретной команде эта утилита вызывается с аргументами -tlnp:

-t требует выдавать информацию только о сокетах TCP.
-l требует выдавать информацию только о прослушиваемых сокетах.
-n требует не выполнять обратный поиск по IP.
-p требует выдавать PID и имя программы, которой принадлежит сокет (требуются права root).
Для того, чтобы получить более подробную информацию, касающуюся сокетов, открытых на вашем компьютере, используйте утилиту lsof. Более подробные данные можете узнать из моей статьи "Утилита Unix, о которой вы должны знать: lsof" (прим. ред.: или из статьи "Утилита lsof - полезный инструмент администратора" на нашем сайте) .

21. Форматированная выдача списка файловых систем, смонтированных в текущий момент

$ mount | column -t

Здесь важно не то, что выдаются файловые системы. Важна команда column -t. Она принимает входной поток и форматирует его по столбцам так, чтобы столбцы были выравнены по вертикали.

Ниже показано, как список смонтированных файловых систем выглядит без команды column -t:

$ mount

/dev/root on / type ext3 (rw)
/proc on /proc type proc (rw)
/dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)

А теперь — с командой column -t:

$ mount | column -t

/dev/root                 on  /      type  ext3   (rw)
/proc                     on  /proc  type  proc   (rw)
/dev/mapper/lvmraid-home  on  /home  type  ext3   (rw,noatime)

Вы можете улучшить эту одностроковую команду, добавив заголовки столбцов:

$ (echo "DEVICE - PATH - TYPE FLAGS" && mount) | column -t

DEVICE                    -   PATH   -     TYPE   FLAGS
/dev/root                 on  /      type  ext3   (rw)
/proc                     on  /proc  type  proc   (rw)
/dev/mapper/lvmraid-home  on  /home  type  ext3   (rw,noatime)

В действительности столбцы 2 и 4 не нужны. Мы можем использовать утилиту текстовой обработки awk для того, чтобы их удалить:

$ (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t

DEVICE                    PATH   TYPE   FLAGS
/dev/root                 /      ext3   (rw)
/proc                     /proc  proc   (rw)
/dev/mapper/lvmraid-home  /home  ext3   (rw,noatime)

Наконец, мы можем сделать команду алиасом так, чтобы команда mount всегда выдавала красивый отформатированный вывод. Давайте определим алиас nicemount:

$ nicemount() { (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t; }

Попробуем алиас:

$ nicemount

DEVICE                    PATH   TYPE   FLAGS
/dev/root                 /      ext3   (rw)
/proc                     /proc  proc   (rw)
/dev/mapper/lvmraid-home  /home  ext3   (rw,noatime)

Это работает!

22. Запуск предыдущей шелл команды, но с заменой "foo" на "bar"

$ !!:gs/foo/bar

Я уже объяснял этот тип однолайновой команды по следующей ссылке  (перевод). Пожалуйста, обратите внимание на продолжение этого объяснения.

Итак, здесь !! вызовет предыдущую команду оболочки, а :gs/foo/bar заменит (флаг :s) все (флаг g) вхождения foo на bar. Конструкт !! называется определителем события.

23. Следим за изменениями файлов

$ watch -d -n 1 'df; ls -FlAt /path'

Эта одностроковая команда следит за изменениями файлов в директории /path. Здесь используется команда watch, которая периодически вызывает заданную команду. Флаг -d указывает команде watch отображать различия, которые произошли между вызовами команды (так что вы видите, какие файлы добавляются или удаляются в директории /path). Флаг -n 1 указывает, что команду следует повторять каждую секунду.

Команда, которая исполняется, df; ls -FlAt /path, представляет собой в действительности две команды, выполняемые последовательно одна за другой. Сначала команда df выдает данные о том, сколько используется дискового пространства, а затем команда ls -FlAt выдает список файлов в директории /path. Аргумент -F указывает ls сортировать файлы, а добавление */=>@| к именам файла, требует показывать, являются ли файлы исполняемыми (*), директориями (/), сокетами (=), файлами типа doors (>) (doors - механизм межпроцессного взаимодействия в операционных системах Unix; он представляет собой разновидность функционального вызова - прим.пер.), символическиеми ссылками (@) или именованными конвейерами (|). Аргумент -l указывает выдавать список всех файлов, аргумент -A - скрывать директории . и .., а -t — сортировать по времени создания/изменения файлов.

Специальное замечание о doors – этот механизм взят из Solaris и действует аналогично конвейерам, за исключением лишь того, что запускается программа, которая, как предполагается, является принимающей стороной. Обычный конвейер мог бы быть заблокирован до тех пор, пока пока другая сторона открывает его, а door сама запускает другую сторону.

На самом деле выдаваемый результат будет выглядеть лучше, если вы к df добавите аргумент -h, результат будет более удобочитаем. Вы также можете добавить аргументы команды watch, задав для нее -dn1. Вот окончательный вариант:

$ watch -dn1 'df -h; ls -FlAt /path'

Еще замечание: -d в системе BSD означает –differences.

24. Дистанционное монтирование директория с помощью SSH

$ sshfs name@server:/path/to/folder /path/to/mount/point

Это правда, что вы можете через SSH смонтировать удаленный директорий локально! Однако, вам нужно сначала следующие две программы:

FUSE, которая позволяет реализовывать файловые системы в программах, работающих в пользовательском пространстве, и
sshfs клиент sshfs, который использует FUSE и sftp (безопасный ftp — идет в комплекте с OpenSSH, и уже есть в вашей системе) для доступа к удаленному хосту.
И это все, теперь вы можете использовать sshfs для монтирования удаленных директориев через SSH.

Для того, чтобы размонтировать, используйте fusermount:

fusermount -u /path/to/mount/point

25. Чтение Википедии через DNS

$ dig +short txt .wp.dg.cx

Это, пожалуй, самая интересная одностроковая команда сегодня. Дэвид Ледбитер (David Leadbeater) создал сервер DNS, который, когда делается запрос с помощью команды типа TXT, возвращает краткую неформатированную текстовую версию статьи Википедии. Смотрите презентацию его работы.

Давайте, например, выясним, что означает слово "hacker":

$ dig +short txt hacker.wp.dg.cx

"Hacker may refer to: Hacker (computer security), someone involved
in computer security/insecurity, Hacker (programmer subculture), a
programmer subculture originating in the US academia in the 1960s,
which is nowadays mainly notable for the free software/" "open
source movement, Hacker (hobbyist), an enthusiastic home computer
hobbyist http://a.vu/w:Hacker"

Эта одностроковая команда использует dig, стандартную утилиту системных администраторов, с помощью которой делается запрос DNS. Параметр +short указывает, что в ответе следует вернуть только текст, а txt делает запрос записи типа TXT.

Эта одностроковая команда действительно достойна иметь алиас, так что давайте сделаем алиас:

wiki() { dig +short txt $1.wp.dg.cx; }

Попробуйте следующее:

$ wiki hacker

"Hacker may refer to: Hacker (computer security), ..."
Это работает!

Если у вас нет dig, вы также использовать команду host, которая также выполняет поиск по DNS:

host -t txt hacker.wp.dg.cx

26. Рекурсивная загрузка вебсайта с помощью wget

$ wget --random-wait -r -p -e robots=off -U Mozilla www.example.com

Эта одностроковая команда делает то, что указано. Ниже объясняются аргументы:

--random-wait - ожидание между запросами от 0.5 и до 1.5 секунд.
-r - включает рекурсивный поиск.
-e robots=off - игнорирование записи robots.txt.
-U Mozilla - устанавливает для заголовка "User-Agent" значение "Mozilla". Хотя лучше выбрать реально существующую запись User-Agent , такую как "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)".
Некоторые другие полезные параметры:

--limit-rate=20k - ограничивает скорость скачивания равной 20 Кбайтов/сек.
-o logfile.txt - журнал скачивания.
-l 0 - убирает ограничение на глубину рекурсии (которая по умолчанию равна 5).
--wait=1h - хитрый параметр, указывает скачивать по 1 файлу за час.

27. Копирование аргументов последней команды

ALT + . (или ESC + .)

Это сочетание горячих клавиш работает только в оболочке в режиме редактирования emacs. При этом в текущую команду копируется последний аргумент последней выполненной команды. Смотрите пример:

$ echo a b c
a b c

$ echo 
$ echo c

Если вы повторяете это сочетание, то копируется последний аргумент из команды, выполненной перед последней командой, затем, если вы повторяете снова, копируется последний аргумент из команды, выполненной перед командой перед последней командой, и т.п.

Смотрите пример:

$ echo 1 2 3
1 2 3
$ echo a b c
a b c

$ echo 
$ echo c

$ echo  again
$ echo 3

Однако, если вы желаете получить первый, второй или n-ый аргумент, то используйте клавиши цифр ALT + 1 (или ESC + 1) или ALT + 2 (или ESC +2), и т. д. Смотрите пример:

$ echo a b c
a b c

$ echo  
$ echo a
a

$ echo  
$ echo b
b

Смотрите описание и справочную табличку всех горячих клавиш в моей статье "Горячие клавиши в режиме редактирования Emacs".

28. Исполнение команды без сохранения ее в истории выполненных команд

$ <пробел>команда

Эта одностроковая команда работает, по меньшей мере, в bash, я не проверял ее в других оболочках.

Если вы начинаете вашу команду пробелом, то она не будет сохранена в истории команд bash (файл ~/.bash_history). Это поведение контролируется с помощью переменной среды оболочки $HISTIGNORE. Установите значение HISTIGNORE="&:[ ]*", что будет указывать не сохранять в истории команд повторные команды и команды, которые начинаются с пробела. Элементы в $HISTIGNORE разделяются между собой двоеточием.

Если вам это интересно, смотрите крат

Источник: http://rus-linux.net/nlib.php?name=/MyLDP/consol/oneliners.html
Категория: Shell | Добавил: oleg (30.04.2010) | Автор: Н.Ромоданов
Просмотров: 1444 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024