Почему это что-то делает Баш говорит, что команда modavar, даже если я создал псевдоним

#bash

Вопрос:

Обратите внимание, что это исходный код, поэтому это не сценарий оболочки.

Я не спрашиваю, как включить псевдоним в неинтерактивной оболочке. Я сделал это: shopt -s expand_aliases .

Версия Bash-5.1.4.

Как воссоздать:

Создайте файл с именем «p»:

 linky(){
comdll="cat"
shopt -s expand_aliases
alias modavar="$comdll"
echo "$argin" | modavar #| getlinks "$argin" | sort -u

}
 

Тогда беги

 echo "source p ; linky https://duckduckgo.com" | bash --norc
 

Ожидаемый результат:

 https://duckduckgo.com
 

Фактический объем производства:

 p: line 5: modavar: command not found
 

Когда я пробегу этот раз, он даст мне

 linky(){ alias jkl=echo hel; jkl; }
linky
bash: jkl: command not found
 

Но если я сделаю это,

 linky(){ alias jkl=echo hel; jkl; }
linky
linky(){ alias jkl=echo hel; jkl; }
linky
 

Это дает мне

 hel
 

Что происходит?

Комментарии:

1. Вы показали свой код по-своему хорошо, но я не понимаю вопроса на уровне английского языка (что означает повторение, и название вопроса). Однако я вижу, что вы используете переменную argin , которую вы никогда не устанавливали — это бросается в глаза. Кроме того, я бы также использовал опцию -x в вашей команде bash, если вы еще не закончили отладку.

2. чтобы исправить или переделать проблему, у меня есть возможность чтения selvar.

3. С программой, как вы ее опубликовали, я бы ожидал, что вы просто получите пустую строку (один символ новой строки) в качестве вывода. Возможно, вы также могли бы объяснить, какой результат вы получаете.

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

5. @Inee_94 : Что произойдет, если вы переместите определение псевдонима перед определением функции? псевдонимы не функционируют-в любом случае, локальные.

Ответ №1:

Вы не можете определить псевдоним внутри функции и использовать его там. Рассмотрим эти примеры:

 alias foo=cat
ffoo() {
  echo abc|foo
}
fbar() {
  alias bar=cat
  echo abc|bar
}
ffoo  #->prints abc
fbar  #->prints command not found