Como escrever o alias para usar o primeiro parâmetro ou * se o parâmetro estiver em branco?

2

Eu quero escrever um comando alias para 'ls', para que, se eu passar um parâmetro, o alias o use, mas se eu não o fizer, ele usaria '*'. Este é o alias que eu tenho hoje:

alias lsd='ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"

Meu problema é que não importa o que eu digite para o comando lsd , sempre obtenho todos os arquivos na resposta. Portanto, quando digito lsd *.sh , ainda obtenho todos os diretórios e arquivos na listagem.

Copiei esse alias de outra postagem do SuperUser, mas ainda não entendi.

Obrigado por qualquer ajuda.

UPDATE : Ok, agora eu tenho essa função definida no meu arquivo .bashrc:

function lsd() {
  if [[ -z $1 ]] ; then
    command ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"
  else
    command ls --color -lh "$1" | grep "^d" && ls --color -lh "$1" | grep -v "^d"
  fi
}

Quando executo isso com apenas lsd , funciona como eu quero. Quando eu o executo com lsd *.wav , eu ainda obtenho os nomes dos diretórios na saída e vejo "Arquivo binário x.wav corresponde à saída". O que estou fazendo de errado?

Caso não esteja claro, estou tentando listar diretórios e arquivos, mas apenas aqueles que correspondem ao primeiro parâmetro no comando. Então, quando eu digito lsd *.wav , não espero ver diretórios, pois seus nomes não terminam com .wav. Obrigado por toda a ajuda! :)

LAST: Não importa. Eu estava usando o .bashrc de origem para tentar atualizar o bash, mas isso não estava funcionando, então os comandos antigos ainda estavam em execução. Fechei minha sessão ssh e entrei novamente e esse novo comando está funcionando agora. Obrigado a todos!

    
por Peter 20.01.2014 / 21:28

3 respostas

4

Os aliases não recebem parâmetros. Use o alias se você quiser substituir apenas uma string longa por uma curta. Para processamento de parâmetros, use uma função:

ls () {
    if [[ -z $1 ]] ; then
        command ls *
    else
        command ls "$@"
    fi
}
    
por 20.01.2014 / 22:12
1

Use -z para verificar se a variável não está definida.

alias ls='[ -z $1 ] && ls * || ls $*'
    
por 20.01.2014 / 21:35
0

Como outros já disseram, "alias" não processa os argumentos da linha de comando dados na linha de comando que invoca o comando "aliased". Ele simplesmente passa adiante todos os argumentos da linha de comando para o comando substituído, anexando os argumentos ao final.

Aqui está um exemplo de script teste para mostrar esse efeito ...

Comece com um script como este:

[~]# cat /some...path/ls1.sh
#!/bin/sh

dollarpound="$1"
shift
dollarone="$1"
shift

echo ""
echo "dollarpound=\"$dollarpound\""
echo "dollarone=\"$dollarone\""
echo "\$*=\"$*\""
echo "\$@=\"$@\""
echo "\=\"$1\""
echo "\=\"$2\""
echo ""

if [ $# -eq 0 ]; then
  echo ls --color -lh *
else
  echo "ls --color -lh $*"
fi
echo ""
[~]#

Em seguida, atribua esse script a um alias:

[~]#alias lsx='/some...path/ls1.sh $# "$1"'
[~]#

Invoque o alias lsx sem argumentos:

[~]# lsx

dollarpound="0"
dollarone=""
$*=""
$@=""
$1=""
$2=""

ls --color -lh ant bat cat dog eel.txt fox.txt goat.jpg horse.jpg

[~]#

Invoque o alias lsx com 1 argumento: "*.txt" :

[~]# lsx *.txt

dollarpound="0"
dollarone=""
$*="eel.txt fox.txt"
$@="eel.txt fox.txt"
$1="eel.txt"
$2="fox.txt"

ls --color -lh eel.txt fox.txt

[~]#

Observe que o script chamado pelo comando "aliased" relata 0 argumentos em vez de 1 ( "*.txt" ) ou 2 ( "eel.txt", "fox.txt" ).

Invoque o alias lsx com 4 argumentos:

[~]# lsx ant bat cat dog

dollarpound="0"
dollarone=""
$*="ant bat cat dog"
$@="ant bat cat dog"
$1="ant"
$2="bat"

ls --color -lh ant bat cat dog

[~]#

Observe que o script chamado pelo comando "aliased" relata os argumentos 0 em vez de 4 .


Então, uma versão funcional do script é:
[~]# cat /some...path/ls2.sh
#!/bin/sh

if [ $# -eq 0 ]; then
  \ls --color -lh *
else
  \ls --color -lh $*
fi
[~]#

(Observe o \ antes de ls . Isso impede que ls seja substituído por outros "aliases", etc ...).

Atribua o script de trabalho a um alias:

# alias lsx='/some...path/ls2.sh'
[~]#

Invoque o alias lsx sem argumentos:

[~]# lsx
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 fox.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 goat.jpg
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 horse.jpg

ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]

Observe que o script detectou que não havia argumentos e executou "ls *" em vez de "ls" (sem argumentos).

Invoque o alias lsx com 1 argumento: "*.txt" :

[~]# lsx *.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 fox.txt
[~]

Invoque o alias lsx com 4 argumentos:

[~]# lsx ant bat cat dog
ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]#

Se houver um motivo pelo qual você deseja fazer isso com um "alias", isso deve funcionar para você. Apenas dê o apelido e o script, qualquer que seja o nome que você goste. Por exemplo, se você quiser "alias" o comando ls , use alias ls='/some...path/ls2.sh' (com o caminho e o nome usados para o script).

Por outro lado, se você quiser que esse comando tenha um nome exclusivo, como lsx por exemplo, pode ser mais simples apenas fornecer o script com esse nome e colocar o script em um pasta incluída no caminho, como: /bin/lsx , ou o que você quiser.

    
por 21.01.2014 / 19:42