当我不小心打开大写锁定并尝试运行一些区分大小写的工具时,我正在尝试制作一个方便的功能来解决问题。
例如,我偶尔会发现自己在打字MAKE DEBUG
而不是make debug
.
我现在所拥有的非常简单:alias MAKE="make"
编辑生成文件以复制规则,例如DEBUG: debug
.
我更喜欢一种适用于论点的解决方案,而无需修改所涉及的工具。
当我不小心打开大写锁定并尝试运行一些区分大小写的工具时,我正在尝试制作一个方便的功能来解决问题。
例如,我偶尔会发现自己在打字MAKE DEBUG
而不是make debug
.
我现在所拥有的非常简单:alias MAKE="make"
编辑生成文件以复制规则,例如DEBUG: debug
.
我更喜欢一种适用于论点的解决方案,而无需修改所涉及的工具。
如果您只想让 makefile 中的所有内容都为小写,则可以使用 GNU sed 将整个内容小写:
sed -i 's/.*/\L&/' Makefile
您还可以构建一个更具区分性的 sed 脚本,但\L 替换转义是您的朋友。
由于您使用 tr 标记了您的问题,因此您可能还需要 tr 解决方案。这有点麻烦,因为 tr 不会进行就地翻译,但您可以随机播放临时文件或使用来自moreutils的海绵。例如:
tr '[[:upper:]]' '[[:lower:]]' < Makefile | sponge Makefile
使用@Clayton Hughes 的casefixer
解决方案,这里有一个解决方案可以处理有趣的事情,比如参数中的空格($*
搞砸了):
casefixer() { eval "$(printf "%q " "$@" | tr '[:upper:]' '[:lower:]')"; }
alias MAKE='casefixer make'
注意:这是一件相当危险的事情,因引起真正奇怪的错误eval
而享有当之无愧的声誉。然而,在这种情况下,双引号和编码命令及其参数与 %q 的组合应该可以防止出现问题。至少,我找不到它做任何意外的案例。
这涉及一个脚本,但避免了我之前尝试的 Ctrl-D 问题:
对于每个命令,别名如
alias MAKE="casefixer make"
然后是我在以下位置创建的以下文件/usr/local/bin/casefixer
:
#!/bin/bash
command=`echo $1 | tr '[:upper:]' '[:lower:]'` # convert 1st arg to lowercase, it's the command to invoke
shift # remove 1st arg from $*
$command `echo "$*" | tr '[:upper:]' '[:lower:]'` # convert arguments to lowercase, and invoke the command with them
这里值得一提的是readline
命令“downcase-word”(默认绑定)。M-u
假设您输入了“MAKE DEBUG”。如果在按回车之前捕获它,则可以使用 将光标移动到行首C-a
。(否则,请先使用向上箭头返回命令)。然后,每次点击M-u
,光标后面的单词都会变为小写,光标会移动到下一个单词的开头。
这有点费力,而且我看不到一次将整行小写的方法。也许有人可以改进这一点。
这是一个解决方案,尽管它并不完美:
alias MAKE="make `tr '[:upper:]' '[:lower:]`"
它可以工作,但有一个不幸的问题是我需要在开始执行任何操作之前按 Ctrl-D 发送 EOF。