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

UnixForum





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

14 советов и хитростей, касающихся командной строки

Оригинал: 14 Command line tips & tricks
Автор: Himanshu Arora
Дата публикации: 1 July, 2014
Перевод: Н.Ромоданов
Дата перевода: июль 2014 г.

Чтобы системе в Linux опираться на прочный фундамент знаний, важно хорошо знать особенности работы в командной строке. Далее мы ответим на 14 из наиболее часто задаваемых вопросов.

В этой статье вы найдете список из 14 практических советов и хитростей, относящихся к использованию командных строк в системе Linux, причем в удобном виде вопросов и ответов, назначение которых - предоставить ценную информацию для тех, кто только начинает пользоваться системой Linux.

Вопрос №1: Я новичок в Linux. Советуют никогда не входить в систему с правами администратора. Как я могу узнать, вошел ли я в систему как root или нет?

Как новичок в Linux, первое, что вы должны знать, это то, что означают права пользователя root и почему эксперты говорят, что вы никогда не должны входить в систему как пользователь root (до тех пор, пока это не будет абсолютно необходимым).

root - это имя пользователя с учетной записью пользователя в Linux, которая разрешает читать / записывать / удалять практически все, что есть в системе. Этот пользователь по умолчанию существует в каждом дистрибутиве Linux, хотя в некоторых из них (например, в Ubuntu) перед тем, как использовать его первый раз, требуется активировать его вручную. Активация здесь означает задание при помощи команды passwd пароля для пользователя root. Пользователь root также называется суперпользователем.

Поскольку учетная запись пользователя root имеет неограниченные привилегии, вы можете, когда войдете в систему с правами root, выполнять в системе Linux почти любое действие. Например, вы можете удалить из Linux стандартную команду или двоичный модуль, изменить конфигурационный файл системы, поменять пароли пользователей, изменить сетевые настройки, настройку брандмауэра и так далее. Список можно продолжать бесконечно. Но, как говорится, большие возможности требуют большей ответственности. К сожалению, обычные пользователи, как правило, не настолько ответственны и недостаточно внимательны с тем, чтобы пользоваться учетной записью root. Представьте себе сцену, в которой обычный пользователь, вошедший как root, случайно изменяет некоторые настройки брандмауэра системы или, что еще хуже, случайно в корневом каталоге (/) выполняет команду rm -rf *.

Вы просто не можете себе представить масштабы ущерба, который с помощью учетной записи root может быть за один раз нанесен случайно вами или хакером. Это та причина, почему всегда советуют не использовать учетную запись root до тех пор, пока это не будет абсолютно необходимым. Даже тогда, когда требуется что-нибудь сделать, что требует привилегий с root, всегда для получения привилегий пользователя root используйте такие команды, как sudo или su -c, а не входите в систему как пользователь root, поскольку привилегии будут даны для выполнение одной команды или будут действовать (как максимум) в течение определенного периода времени.

Вопрос №2: Иногда, когда я запускаю программу из командной строки, строка приглашения блокируется до тех пор, пока я не закрою программу. Как избежать этого?

Всякий раз, когда вы запускаете команду в системе Linux, подсказка в командной строке не будет освобождаться до те пор, пока это команда не завершит свою работу. Команда, в зависимости от того, для чего она предназначена, может быть завершена в течение нескольких секунд или может занять даже несколько минут. Например, если вы с помощью команды find пытаетесь найти файл во всей системе, то на это может потребоваться больше времени, чем при попытке найти файл в небольшом каталоге. Аналогично, копирование маленького текстового файла завершится быстрее по сравнению с копированием фильма с высоким качеством изображения.

Иногда пользователь не желает ждать завершения команды и хотел бы в то же самое время продолжать делать что-нибудь другое. Для достижения этой цели имеются несколько способов:

- Выполните команду, добавив к ней в конце символ '&'. Это гарантирует, что команда будет выполняться в фоновом режиме, а терминал немедленно будет освобожден.

- Уже запущенную команды, которая выполнялась без использования символа '&', завершите при помощи нажатия клавиш Ctrl+Z, а затем запустите команду ‘bg’ для того, чтобы перевести выполнение первой команды в фоновый режим.

Другие важные моменты:

- Чтобы получить список всех команд, работающих в фоновом режиме, используйте команду ‘jobs’.

- Чтобы команду, работающую фоновом режиме, вернуть из фонового режима, используйте команду ‘fg’.

- Если есть несколько команд, работающих в фоновом режиме, то вы для того, чтобы вернуть из фонового режима конкретную команду, можете в команде ‘fg’ указать идентификатор задания ID этой команды (указывается в списке, выдаваемом командой ‘jobs’).

Например, ниже показан исполняемый модуль с именем ‘binary’, который работает бесконечно.

$ ./binary

Теперь для того, чтобы перевести эту команду в фоновый режим, используйте клавиши Ctrl+Z, а затем — команду ‘bg’.

$ ./binary
^Z[1]+ Stoppedbinary$ bg
[1]+ ./binary &
$

Обратите внимание на то, что приглашение в командной строке появляется сразу же, как только команда ‘binary’ переводится в фоновый режим.

Теперь для того, чтобы проверить, что она работает в фоновом режиме, используйте команду ‘jobs’.

$ jobs
[1]+ Running
binary &

Обратите внимание, что указывается команда ‘binary’ и статус, в котором она работает.

Чтобы вернуть команду из фонового режима, воспользуйтесь командой ‘fg’.

$ fg
./binary

Таким образом, вы видите, что выполнение команды ‘binary’ теперь происходит не в фоновом режиме.

Вопрос №3: Иногда во время работы с длинной командой мне для того, чтобы изменять или исправлять некоторые параметры, приходится перемещаться вперед и назад. Использование клавиш со стрелками, как оказывается, занимает довольно много времени. Есть ли какие-нибудь сочетания клавиш для того, чтобы можно было за один раз перемещаться на целое слово?

Да, существуют сочетания клавиш для обхода команды слово за словом, причем как в прямом направлении, так и в обратном. Используйте в командной строке сочетание Ctrl + «клавиша со стрелкой вправо» для того, чтобы двигаться вперед (на одно слово за один раз), или Ctrl + «клавиша со стрелкой влево» для того, чтобы двигаться в обратном направлении (на одно слово за один раз).

Вопрос №4: Есть ли сочетание клавиш для запуска команды, которая уже запускалась раньше, с привилегиями пользователя root?

Да. Вы можете обратиться к последней выполненной команде с помощью ссылки ‘!!’ и перед ней использовать команду sudo.

$ 
find / -name “abc”
find: `/media/himanshu’: Permission denied
find: `/root’: Permission denied
find: `/run/udisks2’: Permission denied
find: `/run/lightdm’: Permission denied
find: `/run/wpa_supplicant’: Permission denied
find: `/run/cups/certs’: Permission denied

Как видно из примера, приведенного выше, мы попытались с помощью команды ‘find’ найти файл с именем ‘abc’, но стали получать ошибки Permission denied (доступ запрещен), поскольку эта команда не может получить доступ к определенным местам в системе. Теперь для того, чтобы снова запустить эту команду с привилегиями пользователя root, мы воспользуемся следующим:

$ sudo !!
sudo find / -name “abc”
[sudo] password for himanshu:

Таким образом можно видеть, что использование ‘sudo’ с ‘!!’ позволяет поместить команду sudo перед ранее запущенной командой. Этот прием особенно полезен тогда, когда команда, которая уже запускалась, сложная или длинная.

Вопрос №5: Если ли сочетания клавиш, с помощью которых я могу ускорить свою работу в командной строке?

Вот несколько сочетаний клавиш, используемых в командной строке:

Иногда во время работы с длинными командами необходимо переместить курсор в начало или конец команды. В этих случаях традиционный метод с использованием клавиш со стрелками оказывается очень медленным. Гораздо быстрее альтернативный вариант - нажать Ctrl+A для того, чтобы отправить курсор в начало команды, или - Ctrl+E для того, чтобы отправить курсор в конец команды.

Написание названий существующих файлов или каталогов в командной строке можно выполнять быстрее с помощью использования клавиши Tab. Просто введите несколько первых символов имени файла, а затем нажмите Tab. Если эти символы соответствуют только одному существующему файлу или каталогу, то для вас автоматически будет дописано это имя; в противном случае, если есть варианты, вы можете завершить набор имени, если добавите еще несколько символов (с тем, чтобы сделать эти начальные символы уникальными) и еще раз нажмете клавишу Tab.

Всем известно, что команду ‘clear’ можно использовать для очистки экрана терминала, но для этого вы должны ввести и запустить эту команду из командной строки. Если вы не хотите запускать команду clear, то для очистки экрана можно использовать сочетание клавиш Ctrl+L, сохранив в текущей строке все, что было набрано.

Иногда в командной строке не рекомендуется для выполнения операций «вырезание-вставка» пользоваться мышкой. Быстрое вырезание текста в командной строке можно выполнить с помощью сочетания клавиш Ctrl+K (убедитесь, что курсор помещен в начало текста, который ложен быть вырезан), а вставить текст можно с помощью сочетания клавиш Ctrl+Y.

Иногда вам нужно повторно запустить сложную/длинную команду, которую выполняли некоторое время назад. Обычно мы для поиска ранее выполненной команды пользуемся клавишами со стрелками, указывающими вверх и вниз. Чтобы ускорить процесс, можно воспользоваться поиском в обратном направлении. Просто нажмите Ctrl+R и напишите несколько символов начала команды, которую вы ищете. Если вы все еще не получили требуемый результат, то для того, чтобы продолжить поиск, попробуйте несколько раз нажать Ctrl+R.

Вопрос №6: Я хочу узнать больше о системе Linux, которой я пользуюсь. Где я могу получить подробную информацию?

Лучшим способом получить информацию о вашей системе Linux является выполнение команды ‘uname’ с различными параметрами. Ниже подробно описываются имеющиеся параметры.

Выполните команду ‘uname’ без параметров для того, чтобы узнать название ядра:

$ uname -s
Linux

Выполните команду ‘uname’ с параметром -r для того, чтобы узнать название релиза ядра:

$ uname -r
3.8.0-23-generic

Выполните команду ‘uname’ с параметром -v для того, чтобы узнать название версии ядра:

$ uname -v
#34-Ubuntu SMP Wed May 29 20:22:58 UTC 2013

Выполните команду ‘uname’ с параметром -m для того, чтобы узнать название платформы:

$ uname -m
x86_64 

Выполните команду ‘uname’ с параметром -o для того, чтобы узнать название операционной системы:

$ uname -o
GNU/Linux

Вопрос №7: Иногда я перемещаюсь по разным каталогам, но, в конечном итоге, я хочу вернуться в определенный каталог. Как можно в командной оболочке запомнить путь к каталогу?

Для случая, когда вы сменили только один каталог, вы можете вернуться в предыдущий каталог с помощью команды ‘cd-’.

$ pwd
/home/himanshu/Desktop
$ cd ../practice/
$ cd -/home/himanshu/Desktop
$ pwd
/home/himanshu/Desktop

Таким образом можно видеть, что с помощью ‘cd-’ можно легко вернуться обратно к предыдущему каталогу.

Данный прием замечательный, но в реальной ситуации мы склонны перемещаться по различным каталогам и каталог, к которому мы хотим вернуться, не всегда бывает предыдущим каталогом. В этом случае, можно использовать команды ‘pushd’ и ‘popd’.

$ pwd/home/himanshu/Desktop
$ pushd .~/Desktop 
~/Desktop
$ cd ../practice/
$ cd /home/himanshu/
$ cd 
/home/
$ popd
~/Desktop
$ pwd
/home/himanshu/Desktop

Видно, что команда ‘pushd’ последующей точкой (.) запоминает текущий рабочий каталог, которым в данном случае был каталог /home/himanshu/ Desktop, т. е. там, где мы находились изначально. Это тот каталог, в который пользователь в конце концов хочет вернуться. Затем было много переходов в различные каталоги, а когда, в конце концов пользователь, выполнит команду ‘popd’, он окажется в том каталоге, в который он хотел вернуться (/home/himanshu/Desktop).

Вопрос №8: Что особенного в файлах/каталогах, имена которых начинается с точки?

В Linux есть определенные файлы, в которых запоминается конфигурационная информация, относящаяся к системе или к конкретному пользователю. Как правило, файлы этого типа начинаются с точки (.) и они скрыты. Это означает, что эти файлы не будут видны в случае, если вы в каталоге, в котором они находятся, выполняете простую команду ‘ls’.

$ ls
Desktop Documents Downloads
examples.desktop Music Pictures
practice Public Templates #test#
Videos

В выходных данных, приведенных выше, видно, что простая команда ‘ls’ не выдает в списке домашнего каталога пользователя файлы, начинающиеся с точки. Но, это не означает, что в этом каталоге нет таких файлов. Чтобы это проверить, запустите команду ‘ls’ с параметром -а.

$ ls -a
. .bashrc
Desktop examples.desktop .kde
Pictures #test# .Xauthority
.. .cache
.dmrc .gconf
.local practice .thunderbird .Xauthority.8NWRZW
.adobe .compiz Documents
gnome2 .macromedia
.profile Videos .Xauthority.THC0ZW
.bash_history .config Downloads
.gstreamer-0.10 .mozlla
Public .vim
errors
.bash_logout .dubs .emacs.d
.ICEauthority Music
Templates .viminfo .xsession-errors.old

Таким образом, видно, что в этом каталоге присутствует много файлов, имена которых начинаются с точки. Причина, почему эти файлы по умолчанию скрыты, объясняется тем, что они редко используются обычным пользователем в его повседневной работе.

Вопрос №9: Когда я запускаю команду ‘ls’ в некотором каталоге, я вижу файлы и каталоги различных цветов. Что эти цвета означают?

Различные цвета используются для того, чтобы пользователь мог легко определить тип файла.

Поддержка цвета добавляется с помощью специального пользовательского файла .bashrc, в частности с помощью следующего кода:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && 
eval“$(dircolors -b ~/.dircolors)” ||eval 
“$(dircolors -b)”
alias ls=’ls –color=auto’
#alias dir=’dir –color=auto’
#alias vdir=’vdir –color=auto’
alias grep=’grep –color=auto’
alias fgrep=’fgrep –color=auto’
alias egrep=’egrep –color=auto’
fi

Чтобы декодировать используемый цвет, просто запустите в командной строке следующий код:

$ dircolors -p

Вопрос №10: В чем разница между символом > и символами >>, когда они используются командной строке?

Оба варианта > и >> используются для перенаправления вывода в файл. Разница заключается в том, что вариант > перезаписывает существующий контент новым содержимым, в то время как вариант >> добавляет новое содержимое к существующему контенту.

$ echo “Hi, this is test” > output
$ cat output
Hi, this is test
$ echo “Old Text is overwritten” > output
$ cat output
Old Text is overwritten

Таким образом, видно, что использование > снова и снова в одном и том же файлом заменяет предыдущее содержимое файла.

$ cat output
Old Text is overwritten
$ echo “Old Text is not overwritten
now” >> output
$ cat output
Old Text is overwritten
Old Text is not overwritten now

В этом случае видно, что с помощью >> в файл добавляется новый текст.

Вопрос №11: Иногда у меня возникают проблемы при чтении длинных файлов с помощью команды cat, поскольку текст проскакивает по экрану быстрее, чем я могу его прочитать. Как можно предотвратить это?

В этом случае используйте команду ‘less’. Все что вам нужно сделать, это запустить команду ‘cat’ следующим образом:

$ cat [filename] | less

В результате данные будут находиться на экране до тех пор, пока вы не нажмете на клавиатуре клавишу Enter. Чтобы выйти из этого режима, просто нажмите клавишу Q.

Вопрос №12: Что делать, если я хочу прочитать только несколько первых или несколько последних строк файла?

Для этого вы можете использовать команды ‘head’ и ‘tail’.

$ tail -5 output
/etc/brltty/en-nabcc.ttb
/etc/brltty/brl-al-abt_small.ktb
/etc/brltty/brl-al-abt_basic.kti
/etc/acpi/mediabtn.sh
/etc/fstab.d

Команда ‘tail’, показанная выше, отображает последние пять строк из файла ‘output’.

С помощью этой команды можно также вывести на экран последние ‘n’ байт, использовав для этого параметр -c:

$ tail -c10 output
c/fstab.d

Таким образом, вы можете увидеть последние 10 байтов из файла output.

Точно так же, есть команда ‘head’, с помощью которой отображается содержимое начала файла. Вот несколько примеров:

$ head -10 output
/boot/abi-3.8.0-19-generic
/boot/abi-3.8.0-23-generic
/boot/grub/i386-pc/search_label.mod
/sbin/acpi_available
/sbin/ip6tables
/sbin/e2label/sbin/ntfslabel
/sbin/swaplabel
/sbin/iptables-save
/sbin/ip6tables-restore
$ head -c10 output
/boot/abi-

Вопрос №13: Похоже, что команды ‘find’ и ‘locate’ делают одно и то же. В чем между ними разница?

Обе команды ‘find’ и ‘locate’ выполняют одну и ту же работу: ищут файлы. Однако между этими двумя командами есть большое различие. Команда ‘find’, на самом деле, ищет файлы на диске, в то время как команда ‘locate’ выполняет поиск в базе данных. Эта база данных подготавливается с помощью команды ‘updatedb’.

Поскольку команда ‘locate’ выполняет поиск в базе данных, она выполняется быстрее по сравнению с командой ‘find’, но реальная проблема команды ‘locate’ в том, что она зависит от базы данных. Предположим, что вы добавили новый файл в указанное место на диске, но не обновляли базу данных для чтения с помощью команды ‘locate’; в этом случае команда ‘locate’ не сможет найти новый файл.

$ touch new_file
$ ls new_filenew_file
$ locate new_file
$ sudo updatedb
$ locate new_file /home/himanshu/practice/new_file

Здесь видно, что команда ‘locate’ не смогла найти файл new_file до тех пор, пока база данных не была обновлена с помощью команды ‘updatedb’.

Аналогичная проблема может возникнуть в случае, если вы удалили файл с диска, но не обновили базу данных. Команда ‘locate’ будет продолжать показывать файл в результатах поиска до тех пор, пока база данных не будет обновлена.

$ rm new_file
$ ls new_file
ls: cannot access new_file: No such file or directory
$ locate new_file /home/himanshu/practice/new_file
$ sudo updatedb
$ locate new_file

Таким образом, видно, что даже после того, как файл new_file был удален, команда ‘locate’ в результатах поиска продолжала показывать несуществующую файл до тех пор, пока база данных не была снова обновлена.

Вопрос №14: Что делать, если я хочу выключить или перезагрузить мою систему Linux только из командной строки?

Вы можете использовать команду ‘shutdown’ или ‘reboot’ для выключения или перезапуска системы.

Для того, чтобы остановить или перезагрузить систему, вы кроме этих команд можете изменить системные уровни запуска с помощью команды ‘init’. Для остановки системы можно использовать уровень запуска 0: ($init 0). А уровень запуска 6 можно использоваться для перезагрузки системы: ($init 6).