如何让OSX在选项之前接受位置参数?

时间:2015-08-14 15:01:22

标签: linux macos bash shell

我最近从Linux切换到了OSX。我大量使用控制台,之前我能够做像

这样的事情
ls ./dir -sgh
cp ./file ./dir -Rf

等等。如果我错过了一个选项,只需按向上即可添加。 OSX强迫我在参数之前添加选项,如下所示:

ls -sgh ./dir
cp -Rf ./file ./dir

这种行为令人沮丧,很容易忘记一个选项,你必须导航到一行的开始只是为了添加它。如果你忘记了一个选项,也很难添加另一个选项。

有没有一种简单的方法来修复这种行为并使其以linux方式工作?我想这涉及将ls等默认程序替换为某些对应项。

3 个答案:

答案 0 :(得分:3)

OS X的用户空间是BSD,(过时的)GNU和Apple实用程序的混搭。 如果希望你的实用程序像他们的Linux工具一样,你应该安装整个GNU coreutils套件 Homebrew

安装Homebrew后,只需使用它来安装coreutils:

$ brew install coreutils

编辑:我没有亲自更新我的$PATH,而是YMMV。

如果你的shell没有找到Homebrew安装的coreutils,请确保/usr/local/bin(或你的自定义路径,如果Homebrew是这样配置的)在/usr/bin和{{1}之前} /bin

答案 1 :(得分:1)

在最佳情况下,所有程序都会动态链接系统libc并使用getopt来处理其参数。 getopt只查找参数,直到找到第一个非选项参数,然后停止。您无法更改getopt的此行为。您必须将系统libc替换为具有getopt的不同实现的系统。

但是,无法保证所有程序动态加载libc;有些人可能会静态链接,在这种情况下,替换系统libc将无效。其他人可能甚至不使用getopt。在任何一种情况下,唯一的选择是用一个行为符合你想要的程序替换程序。

答案 2 :(得分:0)

选项处理不是shell的功能。您需要在每个单独的实用程序中修补参数处理逻辑。

或者,您可以安装,例如相应的GNU实用程序。它们与默认的* BSD实用程序不完全兼容,因此您无法替换系统二进制文件;但您可以安排PATH,以便本地安装的版本更适合您的个人使用。 Homebrew很受欢迎。

在Bash中,ctrl-A跳转到行尾,M-n跳过第一个令牌。