我一定错过了一些关于如何做到这一点非常简单的事情,但我有一个简单的脚本:
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.tar.xz) tar xvJf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*.xz) unxz $1 ;;
*.exe) cabextract $1 ;;
*) echo "\'$1': unrecognized file compression" ;;
esac
else
echo "\'$1' is not a valid file"
fi
}
该脚本有效,但我似乎无法在我登录时默认执行它。
我已经查阅了这个非常彻底的答案:How to define and load your own shell function in zsh,我已经设法让我的 $fpath 显示我存储该函数的适当目录。
在我的 .zshrc 配置文件中,我已添加fpath=( ~/.local/bin "${fpath[@]}" )
到底部,这是我的函数所在的路径。
当我输入echo $fpath
时,我得到:
/home/me/.local/bin /home/me/.oh-my-zsh/plugins/git /home/me/.oh-my-zsh/functions /home/me/.oh-my-zsh/completions ...
autoload -Uz extract
但是,除非我每次登录时都明确输入,否则它不起作用。
登录时有没有办法让整个目录自动加载?
您正在混淆脚本和函数。
制作脚本
脚本是一个独立的程序。它可能碰巧是用 zsh 编写的,但您可以从任何地方调用它,而不仅仅是从 zsh 命令行。如果您碰巧从 zsh 命令行或另一个 zsh 脚本运行用 zsh 编写的脚本,那只是巧合,不会影响脚本的行为。脚本在它自己的进程中运行,它不影响它的父进程(例如它不能改变变量或当前目录)。
您的代码完成了一个可以从任何地方调用的独立任务,并且不需要访问运行它的 shell 的状态,因此它应该是一个脚本,而不是一个函数。
脚本必须是可执行文件:
chmod +x /path/to/script
. 它必须以shebang 行开头,让内核知道使用什么程序来解释脚本。在您的情况下,将此行添加到文件的顶部:将文件放在
$PATH
变量中列出的目录中。许多系统都设置了用户的默认值~/bin
或默认值,因此您可以使用这些。如果要添加另一个目录,请参阅http://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path~/.local/bin
PATH
当您键入一个不是别名、函数或内置命令的命令名时,shell 会在其中查找具有该名称的可执行文件
$PATH
并执行它。因此,您无需向 shell 声明脚本,只需将其放在正确的位置即可。制作函数
函数是在现有 shell 实例中运行的代码。它可以完全访问所有 shell 的状态:变量、当前目录、函数、命令历史记录等。您只能在兼容的 shell 中调用函数。
你的代码可以作为一个函数工作,但是你不会通过把它变成一个函数来获得任何东西,并且你失去了从其他地方(例如从文件管理器)调用它的能力。
在 zsh 中,您可以通过在
~/.zshrc
. 或者,为了避免.zshrc
大量函数的混乱,您可以使用自动加载机制。自动加载分两步进行:autoload -U myfunction
。myfunction
查找调用的文件,并将找到的第一个此类文件用作 的定义。myfunction
$fpath
myfunction
所有功能都需要在使用前定义。这就是为什么将文件放入
$fpath
. 用 声明函数autoload
实际上会创建一个存根定义,上面写着“从中加载此函数并重$fpath
试”:Zsh 确实具有通过探索生成这些存根的机制
$fpath
。它嵌入在完成子系统中。#autoload
文件的第一行。.zshrc
,请确保您fpath
在调用完成系统初始化函数之前完全设置compinit
。注意包含函数定义的文件必须包含函数体,而不是函数的定义,因为调用函数时zsh执行的是文件的内容。所以如果你想把你的代码放在一个函数中,你可以把它放在一个名为的文件中,该文件
extract
位于 上的一个目录中$fpath
,包含如果你想在函数加载时运行初始化代码,或者定义辅助函数,你可以使用这个习惯用法(在 zsh 发行版中使用)。将函数定义以及所有辅助定义和任何其他初始化代码放入文件中。最后,调用函数,传递参数。然后
myfunction
将包含:附言
7z x
适用于大多数档案类型。有几种方法可以解决这个问题: