【发布时间】:2018-08-19 04:05:09
【问题描述】:
我编写了简单的命令,让我可以运行终端历史记录中的最后 N 个命令。它看起来像这样:$> r 3,它将重播最后 3 个命令。
我的 bash 个人资料中有以下别名:
alias r="history -w; runlast $1"
然后是 runlast 命令的以下简单 perl 脚本:
#!/usr/bin/env perl
use strict;
use warnings;
my $lines = $ARGV[0] || exit;
my @last_commands = split /\n/,
`bash -ic 'set -o history; history' | tail -$lines`;
@last_commands =
grep { $_ !~ /(^r |^history |^rm )/ }
map { local $_ = $_; s/^\s+\d+\s+//; $_ }
@last_commands;
foreach my $cmd (@last_commands) {
system("$cmd");
}
这可行,但我的 bash 配置文件有别名和其他功能(例如颜色输出),我希望 perl 脚本能够访问。如何为 perl 加载 bash 配置文件,以便它使用我的 bash 配置文件运行 bash 命令?我在某处读到,如果你为 perl “获取 bash 配置文件”,你可以让它工作。所以我尝试将source ~/.bash_profile; 添加到我的r 命令别名中,但这没有效果。不过,我不确定我这样做是否正确。
【问题讨论】:
-
在脚本中使用别名通常是个坏主意,因为这意味着行为可能会根据运行的位置而有所不同,这是支持的噩梦。最好用函数代替。
-
别名定义中的
$1并不意味着您希望它的含义。无论如何,你真正需要了解的关于别名的唯一一件事就是使用函数来代替。