Defina sua função cdc
como
cdc() {
for fn do
if [[ "${fn##*/}" == .* ]]
then
source-highlight --src-lang=sh --out-format=esc -i "$fn"
else
source-highlight --out-format=esc -i "$fn"
fi 2> /dev/null || /bin/cat "$fn"
done
}
-
for fn do
é a abreviação defor fn in "$@"; do
. -
${fn##*/}
analisa o valor de$fn
e remove tudo desde o começo até (e incluindo) o último/
. Ou seja, se$fn
for um nome de caminho completo, essa será apenas a parte do nome do arquivo. -
[[ (the_above) == .* ]]
cheques se o nome do arquivo corresponde ao padrão.*
glob / curinga; ou seja, se o nome do arquivo começa com.
. Observe que esse uso de==
funciona somente dentro de[[ … ]]
; não funciona dentro de[ … ]
. -
Então, se
$fn
for um "arquivo de ponto", executesource-highlight
com a opção--src-lang=sh
.- Você deve sempre colocar referências de variáveis de shell entre aspas duplas
a menos que você tenha uma boa razão para não
e você tem certeza de que sabe o que está fazendo.
Nomes de arquivos Unix / Linux podem conter espaços.
Se você tivesse um arquivo chamado
foo bar
e dissesse/bin/cat "foo bar"
,cat
exibiria o conteúdo do arquivofoo bar
. Mas, se você dissecdc "foo bar"
(com a versão atual da sua funçãocdc
), você executariasource-highlight
com-i foo bar
, que procuraria por um arquivo chamadofoo
e geralmente faria uma bagunça das coisas. E assim, ele falharia, e sua função tentaria/bin/cat foo bar
, que também falhará. Usar"$fn"
faz esse trabalho para nomes de arquivos que contêm espaços. - O programa
cp
requer que você especifique, na lista de argumentos, o nome do arquivo ou diretório para o qual você deseja gravar. Esta é uma das poucas exceções à regra de que a maioria dos programas gravar na saída padrão por padrão (a menos que você especifique de outra forma). Você não precisa dizer-o STDOUT
e gostaria de saber por que o (s) autor (es) do programa tornou possível que você especificasse isso.
E, sim, percebo que você acabou de copiar tudo isso da resposta à sua outra pergunta.
- Você deve sempre colocar referências de variáveis de shell entre aspas duplas
a menos que você tenha uma boa razão para não
e você tem certeza de que sabe o que está fazendo.
Nomes de arquivos Unix / Linux podem conter espaços.
Se você tivesse um arquivo chamado
- Obviamente, se
$fn
não for um arquivo de ponto, basta executarsource-highlight
da maneira normal e verificar se há uma extensão. - Observe que
2> /dev/null
e|| /bin/cat "$fn"
podem ser feitos para o blocoif … then … else … fi
na sua totalidade; eles não precisam ser repetidos para cada filial.
Hmm. Minha versão de source-highlight
(3.1.7)
tem uma opção --src-lang=LANGUAGE
( -s LANGUAGE
, como usado por yaegashi, para breve).
Acabei de perceber que não está no excerto da página source-highlight
man
você incluiu na sua pergunta. Então, obviamente
se sua versão de source-highlight
não suportar essa opção,
minha resposta não vai funcionar para você. (E, claro, nem o yaegashi.)
Se esse for o caso, você deve ver se consegue instalar a versão 3.1.7
(ou compatível) de source-highlight
.