我最近从Linux切换到了OSX。我大量使用控制台,之前我能够做像
这样的事情ls ./dir -sgh
cp ./file ./dir -Rf
等等。如果我错过了一个选项,只需按向上即可添加。 OSX强迫我在参数之前添加选项,如下所示:
ls -sgh ./dir
cp -Rf ./file ./dir
这种行为令人沮丧,很容易忘记一个选项,你必须导航到一行的开始只是为了添加它。如果你忘记了一个选项,也很难添加另一个选项。
有没有一种简单的方法来修复这种行为并使其以linux方式工作?我想这涉及将ls
等默认程序替换为某些对应项。
答案 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跳过第一个令牌。