Предположительно вы устанавливаете BASH_ENV
в своем .bashrc
. Bash загружает .bashrc
, когда он интерактивен, а не оболочку входа в систему, или , когда это оболочка входа в систему, вызываемая rshd или (во многих дистрибутивах, но это параметр времени компиляции) sshd . Слишком поздно для этого экземпляра bash. Поместите команды прямо в ~ / .bashrc
.
# .bashrc
if [[ $- = *i* ]]; then
# Commands for interactive use: prompt, aliases, key bindings, etc.
# Don't set environment variables here, that goes in .profile.
else
# Commands executed only on remote logins.
# You can set environment variables here. Do not output anything.
fi
Если вам нужно установить только переменные среды, вы можете вместо этого использовать ~ / .pam_environment
, который используется для любого типа входа в систему. См. Каков наилучший независимый от дистрибутива / оболочки способ установки переменных среды?
О других способах выполнения команд при неинтерактивном входе в систему через SSH см. Файлы запуска sh через ssh
Псевдонимы раскрываются при чтении определения функции, не при выполнении функции…
$ echo "Быстрая коричневая лисица перепрыгивает через ленивую собаку". > myfile $ alias myalias = cat $ myfunc () { > myalias myfile >} {{1 }} $ myfunc Быстрая коричневая лисица перепрыгивает через ленивую собаку. $ alias myalias = "ls -l" {{ 1}} $ myalias myfile - rw-r - r-- 1 myusername mygroup 45 декабря 13 07:07 myfile $ myfunc Быстрый коричневый лиса перепрыгивает через ленивую собаку.
Несмотря на то, что myfunc
был определен для вызова myalias
,
, и я переопределил myalias
,
myfunc
по-прежнему выполняет исходное определение myalias
.
Поскольку псевдоним был расширен , когда функция была определена.
На самом деле оболочка больше не запоминает, что myfunc
вызывает myalias
;
она знает только то, что myfunc
вызывает cat
:
$ type myfunc myfunc - это функция myfunc () { cat myfile }
… Псевдонимы, определенные в функции, недоступны до тех пор, пока эта функция не будет выполнена.
$ echo "Быстрая коричневая лисица перепрыгивает через ленивую собаку". > myfile $ myfunc () { > alias myalias = cat >} $ myalias myfile {{1 }} - bash: myalias: command not found $ myfunc $ myalias myfile Быстрая коричневая лисица перепрыгивает через ленивую собаку.
Псевдоним myalias
недоступен
, пока не будет выполнена функция myfunc
.
(Я считаю, что было бы довольно странно
, если бы определения функции, определяющей псевдоним
, было достаточно, чтобы вызвать определение псевдонима.)
Мне нужен ответ, указанный в первом предложении, когда я пытаюсь использовать приведенный ниже фрагмент в моем.bashrc
.
alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
local CMD=${1:-ls} DIR=${2:-.};
$CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; } # list all file, no directories
после unalias -a; source ~/.bashrc
пытаюсь выполнить lf
и lsf
,
$ lf
-bash: ll: command not found
$ lsf
./file1./file2./script.sh... # no color, no control-chars
$ ls $(find -maxdepth 1 -type f)
./file1./file2./script.sh*...
кажется очевидным, что псевдонимы расширяются при определении функции, а не при выполнении функции, поскольку:
lf
, ошибка -bash: ll: command not found
и lsf
, /usr/bin/ls
используется, а не форма псевдонима, без цвета выделение и отсутствие управляющих символов после исполняемого файла.