我有一个脚本,可以同时打开不同的文件。
这里的问题是,当我在bash中定义的指向/home/user1/Software/nc的别名上运行system()时,perl告诉我它不能执行别名,因为当前位置没有文件/目录。我知道别名是有效的,因为当我在shell中直接调用它时,它会很好地打开。
有趣的是,我可以在我的脚本中很好地执行系统("firefox"),但不能使用别名。如何在这个脚本中使用这个别名而不破坏它?
Perl不会运行bash,而是直接执行命令。您可以拨打
bash -c your_command
而不是用Perl调用命令本身。
实际上,这不会加载您的别名。你需要打开一个交互式外壳,就像@MortezaLSC的回答一样。据说有一种方法可以在非交互式shell中正确加载别名,但我想不通。
但是,为什么不直接在perl中使用别名为的命令呢?我认为唯一不应该这样做的原因是,如果你的别名将来会更改,但你仍然想运行它指向的任何命令。至少可以说,这看起来很奇怪,也很危险。
别名的设计是为了减少您在调用具有相同选项等的命令时所做的键入。它们不是bash的通用宏。Bash有一些函数可以做更复杂的事情,但为什么要从perl脚本中调用非平凡的Bash代码呢?你似乎真的不需要这个。将复杂性以及修改和失败的可能性放在一个地方(perl脚本)。
查看类似问题的几个答案:
- https://unix.stackexchange.com/a/1499/41977
- https://superuser.com/a/183980/187150
如果你很聪明,那么你的别名只为交互式shell定义,所以你必须启动bash
并指定你想要一个使用-i
的交互式shell。
system('bash', '-i', '-c', 'shell command');
它工作吗?
system 'bash -i -c "your alias parameter"';