Skip to content

Instantly share code, notes, and snippets.

@vasalf
Last active September 6, 2019 17:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vasalf/576da0f43caff8a8f24a42b96be3b6a2 to your computer and use it in GitHub Desktop.
Save vasalf/576da0f43caff8a8f24a42b96be3b6a2 to your computer and use it in GitHub Desktop.
Кратко про 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