Bash
將多個命令傳遞給更少
我能怎麼做
{$several_commands} | less
並將
less
其視為多個文件並使用:n
和啟用導航:p
。這可能不是更清楚的解釋,所以讓我們考慮一個例子。我目前有一個功能
svndiff () { for a in `svn status | \grep ^M | sed 's/M //'`; do svn diff $a | less; done }
顯然,目的是查看
less
我所有修改過的文件的不同之處。但是使用這種語法,我必須使用 keyQ
來關閉一個“文件”並打開下一個。我希望能夠使用less
命令:n
(下一個文件)和:p
(上一個文件)在文件之間導航。我怎樣才能做到這一點 ?
您可以使用流程替換:
less -f <(svn diff this) <(svn diff that)
但這很難在循環中使用。最好只使用臨時文件:
#!/bin/bash dir=$(mktemp -d) outfiles=() IFS=$'\n' set -f for file in $(svn status | \grep ^M | sed 's/M //') ; do outfile=${file#.} # remove leading dot (if any) outfile=${outfile//\//__} # replace slashes (if any) with __ svn diff "$file" > "$dir/$outfile"; outfiles+=("$dir/$outfile") # collect the filenames to an array done less "${outfiles[@]}" rm -r "$dir"
以上嘗試使文件名在臨時文件的名稱中可見,並對斜線和前導點進行了一些清理。(如果你得到類似的路徑
./foo/bar
。我不記得如何svn
輸出文件名,但無論如何……)該數組用於保持順序,儘管正如@Kusalananda 所說,如果順序無關緊要,我們可以
"$dir"/*
改為這樣做。set -f
如果有人使用全域字元或IFS=$'\n'
空格創建文件名。當然,我們可以稍微簡化腳本並創建,比如編號的臨時文件。