[英]Bash: Pass alias or function as argument to program
我經常需要處理目錄中的最新文件。
通常我會:
ls -rt
然后在vim或更少的文件中打開最后一個文件。
現在我想產生一個別名或函數,例如
lastline() {ls -rt | tail -n1}
# or
alias lastline=$(ls -rt | tail -n1)
調用lastline將輸出目錄中的最新文件,這很好。 但是打電話
less lastline
想要打開不存在的文件“ lastline”。
我如何使bash執行函數或別名,如果可能的話,無需大量輸入$()或``? 還是有其他方法可以達到相同的結果?
謝謝你的幫助。
您正在解析ls
,這非常糟糕。 此外,如果最后一次修改的“文件”是一個目錄,你會less
ING / 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
:
vimlastline() {
last_modified_regfile "$@" && vim -- "$last_modified_regfile_ret"
}
使用如下命令替換:
lastline() { ls -rt | tail -n1; }
less "$(lastline)"
或將其通過管道傳遞給xargs
:
lastline | xargs -I {} less '{}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.