Мы часто устанавливаем на наши Linux-системы пользовательские скрипты и исполняемые файлы. Такими утилитами удобнее пользоваться, просто набирая имя скрипта в командной строке, не задумываясь о пути каталогу, где эти скрипты находятся.
В этой статье мы рассмотрим, где можно разместить такие скрипты.
В операционной системе Linux определена переменная PATH, содержащая список каталогов с исполняемыми файлами. Когда мы пытаемся выполнить команду, система ищет исполняемый файл с подходящим именем в этих каталогах.
Посмотрим содержимое переменной PATH:
echo $PATH
/home/karthik/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/karthik/lib/android/cmdline-tools/tools/bin:/home/karthik/lib/android/emulator:/home/karthik/lib/android/platform-tools:/home/karthik/lib/flutter/bin:/usr/local/go/bin:/home/karthik/.spicetify
Как видим, в переменной PATH содержится список каталогов, разделенных двоеточием.
В большинстве систем в переменную PATH по умолчанию включены некоторые стандартные каталоги, такие как /usr/local/bin и ~/.local/bin. Добавление нашего скрипта в любой из этих каталогов позволяет запускать его из командной строки без указания полного пути.
После копирования скрипта в любой подкаталог /usr, он становится доступным для всей системы. Поэтому все пользователи cмогут использовать его из командной строки. Таким образом, скрипт, который должен быть доступен всем в системе, лучше всего поместить в каталог /usr/local/bin.
Скрипты, предназначенные для личного использования, лучше поместить в подкаталог домашнего каталога ~ (обычно это каталог /home/<ваше имя="">). Стандартное место для размещения личных пользовательских - это каталог ~/.local/bin.ваше>
Мы также можем предварительно добавить нужные каталоги в PATH, а затем вызывать скрипты, находящиеся в этих каталогах, по имени. Например, включим в переменную PATH каталог /home/karthik/.flutter/bin:
$ PATH=$PATH:/home/karthik/.flutter/bin
$ export PATH
После добавления этого каталога в переменную PATH все скрипты и исполняемые файлы из него будут доступны для использования из командной строки по имени.
Чтобы не проделывать эти манипуляции при каждой перезагрузке и сделать добавление каталога в PATH постоянным, можно выполнять две вышеуказанные команды автоматически при инициализации оболочки.
Для этого необходимо включить эти строки в файл /etc/profile (тогда команды будут выполняться для всех пользователей в системе) или в файл ~/.profile (если команды нужно выполнять только для себя).
В этой статье мы узнали, куда помещать пользовательские сценарии, чтобы их можно было использовать из командной строки по имени, без указания полного пути. Мы можем либо добавить эти сценарии в один из каталогов переменной PATH, либо добавить каталог, содержащий сценарии, в переменную PATH.
В идеале скрипты для общесистемного использования следует поместить в каталог /usr, а для личного использования - в свой домашний каталог.
В Linux Mint Cinnamon с помощью комбинации клавиши Win и стрелок можно прижать окно влево/вправо/вверх/вниз, чтобы оно занимало половину экрана или его четверть.
Это позволяет обойтись без консольного мультиплексора типа tmux, если нужно просто разместить рядом две консоли одного размера.
перевод статьи Mary Rose Cook “Git in six hundred words”
Представим, что у вас есть каталог alpha, содержащий файл number.txt, в котором записано слово “first”.
Запустите git init
для превращения каталога alpha в Git-репозиторий.
Выполните git add number.txt
для добавления файла number.txt в индекс (на сцену). Индекс – это список всех файлов, за которыми Git следит. Он отображает имена файлов в их содержимое. Сейчас в нем содержится соответствие number.txt->first
. Запуск команды add
также добавляет в базу данных Git blob-объект, содержащий строку “first”.
Выполните git commit -m first
. В результате будут сделаны три вещи:
git add number.txt
.Выполните команду git clone . ../beta
. В результате будет создан новый каталог beta, являющийся Git-репозиторием.
Перейдите в каталог beta. Измените содержимое файла number.txt на на “second”. Выполните команды git add number.txt
и git commit -m second
. Будет создан объект-коммит, содержащий указатель на своего родителя, первый коммит. После команды commit
ветка main будет указывать на второй коммит.
Вернитесь в каталог alpha. Выполните команду git remote add beta ../beta
. В результате репозиторий beta будет считаться удаленным репозиторием для alpha.
Выполните команду git pull beta master
.
На самом деле при этом выполнятся две команды. Первая из них git fetch beta master
. В результате в репозиторий alpha будут скопированы объекты второго коммита из репозитория beta. Запись в alpha о ветке master в beta будет указывать на второй коммит. Команда обновляет указатель FETCH_HEAD, чтобы показать, что ветка master была загружена из репозитория beta.
Вторая команда, неявно выполняющася при git pull
, – это git merge FETCH_HEAD
. Эта команда:
merge
может просто изменить ветку master, чтобы он указывала на второй коммит. Далее команда merge
обновляет индекс, чтобы его содержимое соответствовало второму коммиту, и обновляет рабочий каталог, чтобы он соответствовал индексу.Выполните команду git branch red
. В результате будет создана ветка red, которая будет указывать на второй коммит.
Выполните команду git checkout red
. Перед этой командой HEAD указывал на ветку master, теперь указывает на ветку red. Ветка red является теперь текущей.
Измените содержимое файла numbers.txt на “third” и выполните команды git add numbers.txt
и git commit -m third
.
Выполните команду git push beta red
. В результате в репозитории alpha будут найдены объекты, соответствующие третьему коммиту, и они будут скопированы в репозиторий beta. В репозитории beta появится ветка red, указывающая на третий коммит.
перевод статьи Borislav Hadzhiev “Why does list.append() return None in Python”
Метод list.append()
возвращает None
, потому что он изменяет первоначальный список. В Python большинство методов, изменяющих объект, в котором они определены ,возвращают None
.
a_list = ['bobby', 'hadz']
a_list.append('.')
a_list.append('com')
print(a_list) # ['bobby', 'hadz', '.', 'com']
Метод list.append()
добавляет элемент в конец списка. Этот метод возвращает None
, так как он изменяет (мутирует) исходный список.
В Python действует соглашение о том, что методы, изменяющие исходный объект, возвращают
None
.
Если вам нужно получить новый список путем добавления элемента к существующему списку, то используйте оператор сложения +
.
a_list = ['bobby', 'hadz']
new_list = a_list + ['com']
print(new_list) # ['bobby', 'hadz', 'com']
print(a_list) # ['bobby', 'hadz']
Оператор сложения
+
, стоящий между двух списков, объединяет их в один список.
Отметим, что при этом первоначальный список остается неизменным.
Также для получения нового списка добавлением к списку нового значения можно использовать метод list.append()
вместе с булевым оператором or
.
a_list = ['bobby', 'hadz']
new_list = a_list.append('com') or a_list
print(new_list) # ['bobby', 'hadz', 'com']
print(a_list) # ['bobby', 'hadz', '.', 'com']
Выражение x or y
возвращает левое значение, если он истинно, и правое значение в противном случае.
Метод list.append()
добавляет элемент в конец списка и возвращает None
, поэтому конструкция a_list.append('com') or a_list
возвращает список a_list
(уже с добавленным в него новым элементом).
Две переменные сохраняют один и тот же список (одно и то же место в памяти), поэтому изменение в одной переменной будут применяться и к другой переменной.
Еще один вариант получения нового списка с добавленным элементом – использовать оператор распаковки итерируемого объекта.
a_list = ['bobby', 'hadz']
new_list = [*a_list, 'com']
print(new_list) # ['bobby', 'hadz', 'com']
print(a_list) # ['bobby', 'hadz', '.', 'com']
Оператор *
позволяет “распаковать” итерируемый объект в последовательность элементов в вызовах функций, списковых включениях (list comprehensions) и выражениях-генераторах.
example = (*('a', 'b'), 'c')
print(example) # ('a', 'b', 'c')
Можно сказать, что мы распаковываем элементы списка и передаем их в качестве значений, разделенных запятыми, для создания нового списка.
После распаковки существующего списка можно добавить в него одно или несколько значений, записывая их через запятую.
Не пытайтесь присвоить результат вызова append()
, insert()
или extend()
какой-либо переменной, так как методы, изменяющие первоначальный объект, как правило возвращают None
.
Для того, чтобы увидеть тип значения, которое возвращает метод, можно в IDE навести на него указатель мыши.
Если метод возвращает None
, то он при выполнении изменит сам объект. Напротив, если метод возвращает значение, отличное от None
, то обычно он вернет новый объект, оставляя первоначальный без изменения.
На ноуте была активирована предустановленная ОС Windows 10.
echo "deb http://repo.yandex.ru/yandex-disk/deb/ stable main" | sudo tee -a /etc/apt/sources.list.d/yandex-disk.list > /dev/null && wget http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG -O- | sudo apt-key add - && sudo apt-get update && sudo apt-get install -y yandex-disk
yandex-disk setup
sudo apt install git
git config --global user.name "Andrey Popov"
git config --global user.email andpop@mail.ru
sudo apt-get install libncursesw5-dev
./configure
Если все нормально прошло, то компилируем и устанавливаем:
make
sudo make install
colorscheme
в ~/.config/vifm/vifmrc.Дистрибутив зависит от версии Ubuntu (ставил для Ubuntu 22.04): https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb
# Update the list of packages
sudo apt-get update
# Install pre-requisite packages.
sudo apt-get install -y wget apt-transport-https software-properties-common
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
# Update the list of packages after we added packages.microsoft.com
sudo apt-get update
# Install PowerShell
sudo apt-get install -y powershell
# Start PowerShell
pwsh
sudo apt install htop
sudo apt-get install zsh
curl -L http://install.ohmyz.sh | sh
chsh -s /bin/zsh
После рестарта системы оболочкой по умолчанию станет Zsh.
sudo apt-get install fonts-powerline
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
plugins=(npm composer sudo web-search zsh-syntax-highlighting git zsh-autosuggestions history-substring-search)
sudo apt update && sudo apt upgrade -y
sudo apt install php8.1
sudo apt install php8.1-curl
sudo apt install php8.1-xml
sudo apt install php8.1-mbstring
sudo apt update
sudo apt install curl php-mbstring git unzip
cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
Затем убедитесь, что хэш установщика совпадает с хэшем SHA-384 для последней версии установщика на странице Composer Public Keys / Signatures. Скопируйте хэш с этой страницы и сохраните его в качестве переменной командной строки:
HASH=544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061
Теперь выполните следующий PHP скрипт, чтобы убедиться, что скрипт установки безопасен для запуска:
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Вы должны увидеть следующий вывод:
Installer verified
Чтобы выполнить глобальную установку composer, используйте следующую команду, которая выполнит загрузку и установку Composer в качестве общесистемной команды composer в каталоге /usr/local/bin:
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer global require "squizlabs/php_codesniffer=*"
sudo apt-get install ruby-full build-essential zlib1g-dev
echo '# Install Ruby Gems to ~/gems' >> ~/.zshrc
echo 'export GEM_HOME="$HOME/gems"' >> ~/.zshrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
sudo apt-get -y install shutter
sudo apt install sqlite3
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
source ~/.zshrc
nvm list-remote
nvm install v18.2.0
Утилита-аналог cat
с усовершенствованным интерфейсом.
sudo apt install bat
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
По умолчанию утилита доступна как batcat
. После создания ссылки и перезагрузки можно будет запускать как bat
.
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
jammy stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
В шестой команде jammy – это версию Ubuntu для Linux Mint 21. Для проверки работы Docker выполним команду:
sudo docker run hello-world
Добавляем себя в группу docker
:
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
sudo apt install -y python3-pip
sudo apt install build-essential libssl-dev libffi-dev python3-dev
sudo apt install -y python3-venv
sudo apt install vim
У нас Vim уже был установлен. Ставим библиотеку для переключения раскладки клавиатуры:
sudo apt-get install build-essential
sudo apt-get install cmake
mkdir ~/xkb-switch && cd ~/xkb-switch && git clone https://github.com/grwlf/xkb-switch.git .
sudo apt-get install libxkbfile-dev
mkdir build && cd build
cmake ..
make
sudo make install
sudo ldconfig
xkb-switch --help
vim-plug
:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Установим локаль ru_RU.utf8:
sudo apt-get install language-pack-ru
Обновим локаль в системе:
sudo update-locale LANG=ru_RU.UTF-8
Далее нужно перезайти в систему и командой locale
проверить текущую локаль.