Como criar um alias e trabalhar em sh para todos os usuários (não no bash)?

0

Minha pergunta talvez seja boba, mas como posso fazer um alias para trabalhar em sh para todos os usuários?

Eu sei que posso colocar um apelido, vamos dizer este:

alias ls='ls -l'

em /etc/bash.bashrc para trabalhar em bash , mas qual é o equivalente para o sh ?

Eu tentei colocar está em /etc/profile , mas não funciona.

    
por Thanasis Petsas 19.04.2013 / 13:24

2 respostas

0

Depois de colocar seu alias em /etc/profile exec siga o comando:

source /etc/profile

Experimente esta solução e feedback aqui.

    
por 19.04.2013 / 13:28
0

tl; dr

Em geral, você não pode.

Wikipedia diz que os scripts de inicialização / desligamento do shell POSIX ( sh ) são

Unspecified (.profile given as an example)

E eu não encontrei nem mesmo este exemplo em POSIX.1-2017 .

Na prática /etc/profile e ~/.profile são originados (pelo menos no Linux, por poucas implementações sh com as quais trabalhei). No contexto da sua pergunta, o problema é que eles são originados apenas por shell de login. Nem todo shell é um shell de login. Nem todo shell interativo é um shell de login.

Além disso, o único conceito de shell de login não parece ser definido por POSIX (alguém me corrija se eu ' Estou errado). Este documento não especifica -l como uma opção obrigatória de sh , embora em pratique muitas implementações para forçar o comportamento do shell de login.

Mesmo que /etc/profile tenha sido analisado por um processo pai (((... -) grand-) grand) de seu shell não-login atual, não há como herdar os alias definidos lá porque os aliases não podem ser exportados; eles não se propagam dentro do ambiente como as variáveis exportadas. Uma função em vez de um alias não ajudará você .

Minha conclusão é: em geral, você não pode esperar que sh forneça qualquer arquivo automaticamente. Para tornar cada fonte sh em um arquivo específico onde seu alias está definido, você precisa encontrar (ou escrever) uma implementação que faça isso.

Um usuário pode criar manualmente um arquivo com . /path/to/file .

Existe, no entanto, uma abordagem que permite fazer ls funcionar como ls -l . Você pode fazer isso com um script de wrapper que substitui /bin/ls e exec -s por /bin/real_ls -l "$@" (onde real_ls é o verdadeiro ls renomeado). Tal abordagem não é incomum, compare esta resposta . Existem desvantagens e armadilhas.

  • Se o verdadeiro ls for um link simbólico para um binário do tipo swiss-army-knife como busybox , o binário ficará confuso se for chamado pelo nome real_ls .

Isso é facilmente evitado usando /another/dir/ls em vez de real_ls . Mas mesmo assim

  • uma atualização futura do sistema pode substituir seu /bin/ls personalizado.

Agora, isso pode ser evitado deixando o% realls como /bin/ls , colocando seu ls em /another/dir e adicionando o /another/dir a PATH como a primeira entrada para todos os usuários geralmente pode fazer via /etc/profile ). Mas então

  • todos os scripts que usam ls e a variável PATH modificada (em oposição a /bin/ls , caminho completo) encontrarão seu ls personalizado.

Isso pode sair pela culatra facilmente. Se você tivesse um alias, um script (em execução em uma subshell, não originado) não herdaria isso. Um script pode definir um alias independente para si mesmo, de qualquer forma ls dentro do script não depende de nenhum alias "externo"; mas pode facilmente depender de qualquer executável que o ls resolva. Mudar o comportamento de ls para cada usuário pode perturbá-los um pouco, mas eles devem se ajustar em seus shells interativos. Mas mudar o comportamento de ls para cada script existente é errado , especialmente porque ls é definido pelo POSIX e a definição afirma explicitamente seu comportamento deve depender da presença da opção -l . Substituir ls pelo seu ls personalizado, em que ls e ls -l são equivalentes, quebrará a conformidade com POSIX.

OK, ls não é o melhor exemplo aqui, porque não se deve analisar sua saída de qualquer maneira . Por outro lado, você nunca sabe de que maneira os usuários (mal) usam qualquer ferramenta.

Observe também que é possível ter uma implementação de sh , onde ls é incorporado. Nesse caso, desconfigurar com /bin/ls ou / e PATH não pode sobrescrever o que significa ls ; um alias ou uma função pode.

Se você gostaria de ter um alias "global" com outro nome, por exemplo

alias ll='ls -l'

então mudar para um script /bin/ll parece perfeitamente seguro para mim. ls permanece intacto, nada está quebrado. O script pode ser assim:

#!/bin/sh
exec ls -l "$@"
    
por 28.10.2018 / 16:35

Tags