Depois de colocar seu alias em /etc/profile
exec siga o comando:
source /etc/profile
Experimente esta solução e feedback aqui.
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.
Depois de colocar seu alias em /etc/profile
exec siga o comando:
source /etc/profile
Experimente esta solução e feedback aqui.
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.
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
/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
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 "$@"