Как запустить параметр в качестве псевдонима в сценарии оболочки?

У меня есть псевдоним alias ll='ls -lF';

Я создал скрипт bash temp.sh:

#!/bin/bash 

# Allow aliases to work in bash NON-interactive mode!
shopt -s expand_aliases

# .. and load them
source ~/.bash_aliases
$1

, но когда я его запускаю, он дает мне:

$ ./temp.sh ll
./temp.sh: line 10: ll: command not found

и когда я меняю сценарий и помещаю псевдоним непосредственно:

#!/bin/bash 

# Allow aliases to work in bash NON-interactive mode!
shopt -s expand_aliases

# .. and load them
source ~/.bash_aliases
ll

... он работает:

$ ./temp.sh   
total 12
-rwxrwxr-x 1 sobi3ch sobi3ch 423 Apr 19 14:21 script.sh*
-rwxrwxr-x 1 sobi3ch sobi3ch 196 Apr 26 12:28 temp.sh*
-rwxrwxr-x 1 sobi3ch sobi3ch 173 Apr 26 12:02 script2.sh

... также когда я запускаю alias Команда в сценарии вместо ll (или $1) Я вижу псевдоним ll между всеми псевдонимами.

Почему мой псевдоним не работает, когда я передаю его в качестве параметра?

2
задан 26 April 2016 в 14:31

1 ответ

На это явно не указывают в документации (по крайней мере нигде, что я мог заметить), но проблема состоит в том, что расширение псевдонима имеет приоритет по переменному расширению; это означает, что $1 маркер проверяется, чтобы видеть, соответствует ли он псевдониму, отброшенному как потенциальный псевдоним и только после этого расширенному в качестве параметра. С тех пор нет никакой команды, названной ll, ошибки Bash.

Вы могли использовать eval, чтобы заставить параметр расшириться дважды, в первый раз в качестве параметра и во второй раз как псевдоним:

#!/bin/bash 

# Allow aliases to work in bash NON-interactive mode!
shopt -s expand_aliases

# .. and load them
source ~/.bash_aliases
eval "$1"
~$ cat temp.sh 
#!/bin/bash 

# Allow aliases to work in bash NON-interactive mode!
shopt -s expand_aliases

# .. and load them
source .bash_aliases
eval "$1"  
~$ cat .bash_aliases 
alias ll='ls -l'
~$ ./temp.sh ll
drwxrwxr-x  3 user user 4096 apr 24 15:18 articles
drwxrwxr-x  2 user user 4096 apr 24 00:20 bin
drwxr-xr-x  2 user user 4096 apr 21 20:22 Documenti
-rw-r--r--  1 user user 8980 apr 21 20:18 examples.desktop
drwxr-xr-x  2 user user 4096 apr 21 21:59 Immagini
drwxr-xr-x  2 user user 4096 apr 21 20:22 Modelli
drwxrwxr-x  6 user user 4096 apr 23 20:45 MT7630E
drwxr-xr-x  2 user user 4096 apr 21 20:22 Musica
drwxr-xr-x  2 user user 4096 apr 21 20:22 Pubblici
drwxr-xr-x  2 user user 4096 apr 24 23:02 Scaricati
drwxr-xr-x  2 user user 4096 apr 24 13:44 Scrivania
-rwxrwxr-x  1 user user  149 apr 26 13:22 temp.sh
drwxrwxr-x  2 user user 4096 apr 26 13:22 tmp
drwxrwxr-x 24 user user 4096 apr 23 13:45 util-linux-2.28
drwxr-xr-x  2 user user 4096 apr 21 20:22 Video
0
ответ дан 27 April 2016 в 00:31
  • 1
    Следует иметь в виду, что, файлы драйвера могут варьироваться. Таким образом, Вы, возможно, должны были бы переустановить их. – Olimjon 23 September 2017 в 00:30

Другие вопросы по тегам:

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