他の人のおかげで、私の「カラー猫」はうまくいきます
(参照未知のファイル形式を含む猫の出力を白黒で色付けする方法は?)。
私.bashrc
:
cdc() {
for fn in "$@"; do
source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
done
}
alias cat='cdc' # To be next to the cdc definition above.
頭、尾などの他の機能にもこの技術を使用できることを願っています。
4つの機能すべてに対してこれをどのように実行できますか?答えを一般化する方法はありますか?
gd
選択して使用できます。git diff
gd() {
git diff -r --color=always "$@"
}
答え1
次のタスクが必要なタスクを実行する必要があります。
for cmd in cat head tail; do
cmdLoc=$(type $cmd | awk '{print $3}')
eval "
$cmd() {
for fn in \"\$@\"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" |
$cmdLoc -
done
}
"
done
次のように圧縮できます。
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
はい
上記の内容をというシェルスクリプトに入れますtst_ccmds.bash
。
#!/bin/bash
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
type cat
type head
type tail
これを実行すると、要求どおりに機能が設定されます。
$ ./tst_ccmds.bash
cat ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ;
done
}
head is a function
head ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ;
done
}
tail is a function
tail ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -;
done
}
行動中
shell() でこれらの関数を使用すると、source ./tst_ccmds.bash
次のように動作します。
猫
頭
尾
プレーンテキスト
どのようなヒントがありますか?
最大のトリック(私はそれをハッキングと呼ぶことを好む)は、パイプの引数としてダッシュ()を使用してパイプの-
STDINからの内容を出力することです。この時点で:cat
head
tail
source-highlight
...STDOUT -i "$fn" | /usr/bin/head - ....
--failsafe
もう1つの秘訣は、次のオプションを使用することですsource-highlight
。
--failsafe
if no language definition is found for the input, it is simply
copied to the output
つまり、言語定義が見つからない場合は、cat
単にその入力を標準出力にコピーするかのように動作します。
エイリアスに関する注意
head
tail
またはがエイリアスの場合、cat
呼び出しの結果type
は実行可能ファイルを指していないため、関数は失敗します。エイリアスと一緒にこの関数を使用する必要がある場合 (たとえば、色付けにless
require-R
フラグを使用する場合)、エイリアスを削除し、別名コマンドを別々に追加する必要があります。
less(){
for fn in "$@"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" |
/usr/bin/less -R || /usr/bin/less -R "$fn"; done
}