Bash:将别名或函数作为参数传递给程序

时间:2015-02-13 09:35:12

标签: bash function alias

我经常需要处理目录中的最新文件。

通常我这样做:

ls -rt

然后在vim或更低版本中打开最后一个文件。

现在我想生成一个别名或函数,比如

lastline() {ls -rt | tail -n1}
# or
alias lastline=$(ls -rt | tail -n1)

调用lastline输出目录中的最新文件,这很好。 但是打电话给

less lastline

想要打开不存在的文件“lastline”。

如何在没有大量输入$()或``的情况下使bash执行函数或别名? 或者还有其他方法可以达到相同的效果吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您正在解析ls,这非常糟糕。此外,如果上次修改的“文件”是目录,您将less / {{}}目录。

因此,您需要一种强大的方法来确定当前目录中的最后一个修改过的文件。您可以使用以下帮助函数(您将vim放入):

.bashrc

然后你可以定义另一个last_modified_regfile() { # Finds the last modified regular file in current directory # Found file is in variable last_modified_regfile_ret # Returns a failure return code if no reg files are found local file last_modified_regfile_ret= for file in *; do [[ -f $file ]] || continue if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then last_modified_regfile_ret=$file fi done [[ $last_modified_regfile_ret ]] } 最后找到的文件的函数:

vim

你甚至可以vimlastline() { last_modified_regfile && vim -- "$last_modified_regfile_ret" } 获取可选参数:它将找到最后修改的常规文件的目录:

last_modified_regfile

然后你甚至可以相应地改变last_modified_regfile() { # Finds the last modified regular file in current directory # or in directories given as arguments # Found file is in variable last_modified_regfile_ret # Returns a failure return code if no reg files are found local file dir local save_shopt_nullglob=$(shopt -p nullglob) shopt -s nullglob (( $# )) || set . last_modified_regfile_ret= for dir; do dir=${dir%/} [[ -d $dir/ ]] || continue for file in "$dir"/*; do [[ -f $file ]] || continue if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then last_modified_regfile_ret=$file fi done done $save_shopt_nullglob [[ $last_modified_regfile_ret ]] }

vimlastline

答案 1 :(得分:0)

使用命令替换如下:

lastline() { ls -rt | tail -n1; }
less "$(lastline)"

或将其传递给xargs

lastline | xargs -I {} less '{}'