Псевдонимы и функции

Предположительно вы устанавливаете 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

20
13.12.2016, 09:07
2 ответа
  1. Псевдонимы раскрываются при чтении определения функции, не при выполнении функции…

     $ 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 
    } 
  2. … Псевдонимы, определенные в функции, недоступны до тех пор, пока эта функция не будет выполнена.

     $ echo "Быстрая коричневая лисица перепрыгивает через ленивую собаку". > myfile 
     
     $ myfunc () {
    > alias myalias = cat 
    >} 
     
     $ myalias myfile {{1 }} - bash: myalias: command not found 
     
     $ myfunc 
     
     $ myalias myfile 
    Быстрая коричневая лисица перепрыгивает через ленивую собаку. 

    Псевдоним myalias недоступен , пока не будет выполнена функция myfunc . (Я считаю, что было бы довольно странно , если бы определения функции, определяющей псевдоним , было достаточно, чтобы вызвать определение псевдонима.)

36
20.08.2021, 11:51

Мне нужен ответ, указанный в первом предложении, когда я пытаюсь использовать приведенный ниже фрагмент в моем.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используется, а не форма псевдонима, без цвета выделение и отсутствие управляющих символов после исполняемого файла.
2
20.08.2021, 11:51

Теги

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