为了定制我的 bash 用户体验,有没有办法使用 .bashrc 来调用常见的命令集。例如,我发现这组命令可以在文本文件中查找搜索字符串,
find /directory -type f -print0 | xargs -0 grep -i 'search string'
我希望能够使用自定义别名(如 grepfindfile)来调用它,然后查看上面的内容命令集在 bash 中显示的方式与从历史记录中提取最后一条命令的方式相同。
或者我必须创造某种bash 脚本? 像 bashrc 文件一样,命令行用户是否共享他们的生产力脚本?它们叫什么?我最喜欢的派对小工具?
--
CF。这里问的 VIM 问题类型相同如何在 vim 中创建查找和替换命令的快捷方式?
答案1
您可以在 .bashrc 中创建一个函数,如下所示:
searchString ()
{
if [ "$1" ] ; then
find /directory -type f -print0 | xargs -0 grep -i "$1"
else
echo "usage ..."
fi
}
答案2
我支持老式的方法:在您的主目录中创建一个 bin 目录并将其添加到 PATH(某些发行版如果~/bin
在登录时找到,将默认执行此操作)。然后在其中创建您可能觉得有用的任何脚本。
为什么?
别名和 shell 函数很不错,但通常只能在 Shell 本身中使用它们。您无法从其他程序(如 xargs)或 shell 调用它们。但脚本文件则不然。您可以像调用任何其他 UNIX 命令一样调用它们,没有任何限制。如果使用 #!/bin/usedshell 进行编码,则当前 shell 无关紧要,也可以从任何其他 shell 调用它们。
如果有人修改了诸如 .*profile 和 .*shrc 之类的登录脚本,则必须在第二个屏幕上执行登录以验证输入错误不会阻止成功登录(很烦人)。
如果我必须在其他用户环境中工作,我只需将我的 bin 目录附加到 PATH 即可立即使用我的脚本,而无需修改其他环境设置。
初学者补充说明:
不要为非常简单的任务创建太多方便的脚本或别名。总有一天,记住所有自己的脚本会比记住它们所基于的 unix 命令更困难 :-)
答案3
我通常将此类命令放在 ~/bin 目录中的 bash 脚本中。我更喜欢使用脚本而不是函数,因为脚本对于我打开的所有 shell 来说都是立即可见的。
对于我不经常使用或每次都需要修改的命令,我有一个使用 grep 搜索的命令行文件,然后只需将其从屏幕复制并粘贴到命令行即可。
我还保存了一个非常大的 bash 历史文件,这样在使用命令后至少一周内都可以从历史记录中获取它们。如果我发现自己经常调用同一个命令,我会把它放到脚本中。
我刚刚发现此解决方案在超级用户中的其他地方使用 bashhistory -s
命令将命令添加到您的 bash 历史记录中。该解决方案可能最接近您的原始请求。
答案4
首先将其缩短为
grep -ir 'search string' /directory
该-r
选项用于递归模式。
:-)
一般来说,缩短命令有三种方法。
别名:非常基础,只允许替换命令。可以输入
~/.bashrc
:alias ll="ls -lFh" alias md="mkdir"
将扩展
ll ~/music
为ls -lFh ~/music
。别名也有优势——它们可以内联扩展;你只需要为此配置一个键盘快捷键。例如,将以下内容放入你的
~/.inputrc
:"\e[1;3C": alias-expand-line
这对应于键AltRight →。
对于更复杂的事情(多个命令,参数)–功能允许使用标准语法功能;同样适用于
~/.bashrc
:count() { sort "$@" | uniq -c | sort -n -r }
这些可以包含多个命令、设置变量、设置条件……任何可以在 shell 脚本中执行的操作。但是,它们不能内联扩展。
外部的脚本– 几乎与函数相同,但没有
foo() { ... }
并且在单独的文件中。(~/bin
是一个受欢迎的位置。)#!/bin/bash post() { curl -sF "sprunge=<$1" http://sprunge.us/; } if [ -z "$1" ]; then file=$(mktemp /tmp/sprunge.XXXXXXXX) cat > "$file" if [ -s "$file" ]; then post "$file" else echo "stdin empty" >&2 fi rm -f "$file" else for file; do echo -n "$file →" post "$file" done fi
将脚本放在单独的文件中有一个好处:它们不局限于
bash
功能。许多我先用bash
脚本开始,然后用 Python 重写,后来又变成了 Perl……