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"
)