O argumento da função é $1
.
Você pode usar modificadores de expansão de histórico para extrair a parte do diretório e o último componente do caminho: se o argumento for ~/directory2/directory1
, então $1:h
será ~/directory2
e $1:t
será directory1
. (Mnemônico: h
ead e t
ail.)
Use parênteses em vez de chaves ao redor do corpo da função. Desta forma, o corpo da função é executado em um subshell (um processo de shell separado), e as atribuições de variáveis, mudanças de diretório e assim por diante afetam apenas a sub-camada.
coolerzip () (
cd $1:h &&
zip -r $2:h.zip $2:h
)
Outras shells não possuem modificadores de expansão de histórico, então você precisa de algo diferente para analisar o argumento. Para o nome do arquivo, ${1##*/}
remove todos os componentes principais do diretório; no entanto, isso não funciona se houver uma barra no parâmetro, enquanto "$(basename -- "$1")"
funciona nesse caso. Para os diretórios principais, use $(dirname -- "$1")
. Note que em shells que não sejam zsh, você precisa colocar aspas duplas em torno das substituições de variáveis .
coolerzip () (
name="$(basename -- "$1")"
cd "$(dirname -- "$1")" &&
zip -r "$name.zip" "$name"
)