设置别名来读取变量,然后在第二个命令中使用;仅当我手动执行它们时才有效

设置别名来读取变量,然后在第二个命令中使用;仅当我手动执行它们时才有效

我使用的是 CentOS 7,我想绑定一个别名来启动 PostgreSQL shell(psql)。我定义了这个别名并将其附加到/etc/profile.d/alias

alias psql-local="read -p \"PSQL: enter the DB to connect: \" db ; sudo -i -u postgres psql --dbname $db"

它可以通过 执行root

而且,我登录为root,然后运行alias​​,我得到:

alias psql-local='read -p "PSQL: enter the DB to connect: " db ; sudo -i -u postgres psql --dbname '

注意这里$db最后是空的。

然后我运行psql-local,但出现错误:

[root@lucas_vm ~]
> psql-local
PSQL: enter the DB to connect: jfps
psql: option '--dbname' requires an argument
Try "psql --help" for more information.

然后我输入/etc/profile.d/,并alias.sh手动运行,然后突然我可以使用这个别名:

[root@lucas_vm /etc/profile.d]
> . alias.sh
[root@lucas_vm /etc/profile.d]
> psql-local
PSQL: enter the DB to connect: jfps
psql (10.5)
Type "help" for help.

jfps=#

如果我退出psql并再次运行alias,我会看到这一行发生了变化:

alias psql-local='read -p "PSQL: enter the DB to connect: " db ; sudo -i -u postgres psql --dbname jfps'

$db改为jfps.

然后,我尝试访问另一个数据库,它再次工作。

但是,当我退出时alias,我看到的是--dbname jfps,而不是第二个数据库的名称。当 I 时echo $db,它是第二个数据库的名称。

为什么?

答案1

因为您使用双引号 ( "..."),所以$db变量将在定义别名时展开,而不是在使用时展开。试试这个:

alias psql-local='read -p "PSQL: enter the DB to connect: " db ; sudo -i -u postgres psql --dbname "$db"'

相关内容