Новые сеансы tmux не являются источником файла bashrc

Обычно для вопросов, подобных этому, ответом является чтение BashFAQ #50: "Я пытаюсь поместить команду в переменную, но сложные случаи всегда заканчиваются неудачей!". Краткое резюме: переменные предназначены для данных, а не для исполняемого кода, и попытка поместить в них код приводит к разного рода проблемам.

Но в данном случае есть еще один критический фактор: вы собираетесь запустить команду через ssh, что означает, что она будет передана удаленной системе как данные и разобрана как команда оболочкой на удаленном компьютере. Это означает, что разумно хранить команду (как данные) в переменной в скрипте (на локальном компьютере).

Мне кажется, что самая большая проблема, с которой вы столкнулись, заключается в том, что когда вы используете обратные кавычки или $( ) (и они не заключены в одинарные кавычки), команда внутри них выполняется немедленно (на локальном компьютере), и ее вывод сохраняется в переменной. Чтобы избежать этого, вы можете экранировать соответствующие символы при определении переменной:

RM_CMD="rm -rf \$(ls -t '${FOLDER}/other_folder' | awk 'NR>5')"

Обратите внимание, что я использовал $( ) вместо обратных кавычек, поскольку это обычно предпочтительнее. Мне кажется, что в некоторых местах вы путаете обратные кавычки с одинарными; они выглядят похоже, но имеют совершенно разные эффекты. $( ) делает по сути то же самое, но не является визуально двусмысленным.

Также я предполагаю, что ${FOLDER} - это переменная на локальном компьютере, поэтому она должна быть развернута немедленно (и я добавил одинарные кавычки вокруг нее на случай, если она содержит пробелы или другие метасимволы оболочки); если она должна быть развернута удаленной оболочкой, используйте \"\${FOLDER|/other_folder\" вместо этого. На самом деле, одинарные кавычки вокруг ${FOLDER} не сработают, если он сам содержит одинарные кавычки. Есть способ исправить это, но я не стал заморачиваться.

Можно также использовать одинарные кавычки в присваивании переменной, но тогда возникнут проблемы с одинарными кавычками в команде awk (нет чистого способа вложить одинарные кавычки в строку с одинарными кавычками) и нет чистого способа расширить ${FOLDER} на локальном компьютере. Эти проблемы можно решить с помощью смешанного цитирования, но это муторно.

Наконец, когда вы используете переменную, вы должны заключить ее в двойные кавычки:

ssh -t user@server "$RM_CMD"

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

17
02.11.2016, 06:05
3 ответа

Насколько я знаю, по умолчанию tmux запускает оболочку для входа в систему. Когда bash вызывается как интерактивная оболочка входа, он ищет ~/.bash_profile, ~/.bash_login и ~/.profile. Поэтому вам нужно поместить source ~/.bashrc в один из этих файлов.

Другой способ решить эту проблему - поместить в ваш файл .tmux.conf строку:

set-option -g default-shell "/bin/bash"
31
27.01.2020, 19:47

Добавление следующего к.tmux.conf:

set-option -g default-shell "/bin/bash"

НЕ дает желаемого результата.

Только при добавлении source "$HOME/.bashrc"к ~/.bash_profileдостигается желаемый результат.

Это будет работать в активном сеансе tmux при открытии нового окна или панели, а также при отсоединении и открытии нового сеанса tmux.

Проверено на:

VERSION="16.04.2 LTS (Xenial Xerus)"
tmux 2.1
9
27.01.2020, 19:47

Ответ Андреса Сальгадо сработал для меня. Просто чтобы добавить к этому.

У меня возникла эта проблема при работе с Ubuntu 20.04.

Вот как я это исправил:

Во-первых, создайте файл с именем .tmuxв домашнем каталоге вашего компьютера, то есть ~/.tmux.conf.

Затем поместите в него конфигурацию, которую вы хотите использовать для Tmux , и сохраните ее. Для меня нужная мне конфигурация была такой же, как пакет экрана GNU , который по умолчанию используется в Ubuntu, поэтому я скопировал содержимое файла ~/.bashrcв файл ~/.tmux.conf. Таким образом, если мне нужно отредактировать какую-либо конфигурацию для Tmux , я бы не стал вмешиваться в конфигурацию для экрана GNU .

Примечание.:Вы можете пропустить этот шаг и просто использовать файл ~/.bashrc, если вам не нужно разделение задач.

Затем добавьте файл в один из файлов ~/.bash_profile, ~/.bash_loginи ~/.profile.Его нужно добавить внизу файла:

source "$HOME/.tmux.conf"

ИЛИ

source "$HOME/.bashrc"

Вот пример:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include.bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
   . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

source "$HOME/.tmux.conf"

Примечание.:Файл ~/.bash_profileимеет первый приоритет, затем файл ~/.bash_loginявляется вторым приоритетом, а затем файл ~/.profileявляется последним приоритетом.

Вот и все.

Надеюсь, это поможет

1
16.10.2020, 14:20

Теги

Похожие вопросы