Skip to content

Instantly share code, notes, and snippets.

@vasalf vasalf/bash.md
Last active Sep 6, 2019

Embed
What would you like to do?
Кратко про bash

Краткий мануал по bash

NB: Это пересказ того, что было на паре, а на паре был очень краткий ликбез. Для полноты ощущений знаний рекомендуется пройти какой-нибудь более полный ликбез. Например, такой на двух языках висит в ссылках на вики в разделе «лекции».

Команды

Обычное соглашение про вызов команд в bash:

<команда> -<флаг> [значение] --<опция> [значение] <аргумент1> <аргумент2> ... <aргументN>

Во многих случаях порядок флагов, опций ти аргументов неважен.

Примеры см. ниже.

Часто используемые команды

  • pwd (от «print working directory») — печатает полный путь к папке, в которой вы находитесь.

  • ls (от «list») — перечисляет файлы в текущей папке

    Полезные флаги:

    • ls -a печатает и скрытые файлы тоже. Скрытым считается любой файл, чьё имя начинается с точки (.).
    • ls -l печатает много полезной информации (размеры файлов, дату последнего изменения, владельца, права доступа, etc).
    • ls -al делает и -a, и -l.
  • cd (от «change directory») — перейти в другую папку.

    Примеры:

    • cd my_directory — перейти в папку my_directory, находящуюся в папке, в которой вы сейчас находитесь
    • cd dir1/dir2 — перейти в папку dir2, находящуюся в папке dir1, находящуюся в папке, в которой вы сейчас находитесь
    • cd /path/to/dir — перейти в папку по пути /path/to/dir
    • cd — перейти в свою домашнюю папку
    • cd ~ — то же самое
    • cd .. — перейти в папку на уровень выше
  • mkdir (от «make directory») — создать папку.

    Полезный флаг:

    • -p — создать также все папки, в которых будет лежать итоговая папка, если их ещё нет.

    Примеры:

    • mkdir my_directory — создать папку my_directory в текущей папке
    • mkdir dir1/dir2 — в папке dir1 создать папку dir2
    • mkdir -p dir1/dir2 — то же, что и выше, только ещё и создать dir1, если такой ещё нет.
    • mkdir /path/to/dir — создать папку по абсолютному пути
  • cp <file1> <file2> (от «copy») — скопировать file1 в file2.

    Полезный флаг:

    • -R — рекурсивно копировать содержимое папки

    Примеры:

    • cp file file2 — скопировать файл
    • cp file dir/ — скопировать файл в папку dir
    • cp file1 file2 dir/ — скопировать файлы file1 и file2 в dir
    • cp -R dir1/ dir2/ — скопировать dir1/ со всеми файлами и подпапками в dir2/
  • mv <file1> <file2> (от «move») — переименовать (переместить) file1 в file2

    Полезный флаг:

    • -R — то же, что и в cp.

    Примеры:

    • mv file file2 — переименовать файл
    • mv file dir/ — переместить файл в другую папку
  • rm (от «remove») — удалить файл

    NB: файлы удаляются не в корзину, а вообще. Действие этой команды отменить нельзя (на самом деле можно, но сложно и без какой-либо гарантии, что получится).

    Полезный флаг:

    • -R — guess what
    • -f — игнорировать несуществующие файлы

    Примеры:

  • rm file — удалить файл

  • rm -Rf dir/ — удалить папку со всем содержимым

Как компилировать

gcc (от «GNU Compiler Collection») — популярный открытый компилятор для C (и далеко не только).

В качестве аргументов принимает входные файлы, на выходе выдаёт либо объектные, либо исполняемые файлы.

Разобранные флаги:

  • -c — собрать объектный файл (*.o). Без этого флага соберётся исполняемый.
  • -o <file> — задаёт имя выходного файла. Без этого флага для исполняемых флагов имя становится a.out.

В случае, если входные файлы — объектные, gcc их слинкует вместе. Если при этом указан флаг -c, на выходе получится объектный файл, объединяющий объекты из всех входных файлов. Если не указан, на выходе будет исполняемый файл.

Вообще, линковку можно осуществлять с помощью предназначенной для этого команды ld. Но ей нужно указывать все требуемые библиотеки, в том числе стандартную библиотеку языка программирования. Если это делать через gcc, зависимости такого рода подтянутся сами собой.

Пример с пары

На паре мы собирали файл hello из двух исходников file.c и hello.c с помощью такой последовательности команд:

Собираем объектные файлы

gcc file.c -c -o file.o
gcc hello.c -c -o hello.o

Теперь ликуем в исполняемый файл hello:

gcc file.o hello.o -o hello

Запускаем исполняемый файл:

./hello

Почему так: по умолчанию, команды ищутся в системных путях (/bin, /usr/bin, и всё другое, что указано в переменной $PATH). Мы же хотим запустить нашу программу, не лежащую в системной папке. Для этого мы указываем путь к нашей программе явно. Здесь . — ссылка на текущую папку (как и .. — ссылка на папку уровнем выше).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.