Bash

將多個命令傳遞給更少

  • February 14, 2018

我能怎麼做

{$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'空格創建文件名。

當然,我們可以稍微簡化腳本並創建,比如編號的臨時文件。

引用自:https://unix.stackexchange.com/questions/423900