set
e shopt
são ambos os shell shell que controlam várias opções. Costumo esquecer quais opções são definidas por qual comando e qual opção define / desmarca ( set -o/+o
, shopt -s/-u
). Por que existem dois comandos diferentes que aparentemente fazem a mesma coisa (e têm argumentos diferentes para fazer isso)? Existe alguma maneira fácil / mnemônica de lembrar quais opções combinam com qual comando?
72
help set
ehelp shopt
verificar se os autores pensam que fazem a mesma coisa.Respostas:
Até onde eu sei, as
set -o
opções são as que são herdadas de outras conchas no estilo Bourne (principalmente ksh), e asshopt
opções são as que são específicas para o bash. Não há lógica que eu conheça.fonte
shopt
é herdada?set -o
opções comoposix
/physical
/interactive-comments
que não estão incluídasksh
eshopt
outras que estão em outras conchas, incluindoksh
algumas comologin_shell
/nullglob
. Como você diz, não há lógica. Provavelmente foi a idéia no início (que o SHELLOPTS seria o padrão e o BASHOPTS, o específico do bash), mas que se perdeu ao longo do caminho, e agora acaba sendo irritante e um fiasco de design de interface do usuário.A diferença está na variável de ambiente alterada usada pelo bash. A configuração com o
set
comando resulta em$SHELLOPTS
. A configuração com oshopt
comando resulta em$BASHOPTS
.fonte
shopt
com US $ SH ELL OPT S em vez de $ BA shopt S.set
é POSIX 7: definir - definir ou desmarcar opções e parâmetros posicionais | pubs.opengroup.orgshopt
não é: Shell e Utilitários: Detalhado Toc | pubs.opengroup.orgProvavelmente ligada à história mencionada por @Gilles.
fonte
Fácil, mas perdido na história. O
set
comando foi originalmente usado para modificar o ambiente da linha de comandos dos shells unix originais/bin/sh
. Então, à medida que várias versões do Unix evoluíam e novos sabores de shell eram adicionados, as pessoas perceberam que precisavam ser capazes de mudar mais coisas (ambientais) para manter os scripts de shell compatíveis. Naquela época Bash ficou muito popular e os adicionais sh ell opt íons era necessário, introduzindoshopt
.Você pode realmente ver esses compat tentativas lidade no
shopt
comando.Mas não no
set
comando.fonte
set
como uma maneira de definir opções não estava nos invólucros originais do Unix, foi introduzido pelo shell Bourne no final dos anos 70.set -o name
em si foi adicionado mais tarde pelo shell Korn, especificado, mas opcional no POSIX, ainda não é suportado pelo "modernos" versões do shell Bourne como o/bin/sh
de Solaris 10.No livro "Linux Shell Scripting with Bash", p 63:
fonte
Parece que as opções "set" são herdadas por subshells e os shopts não.
fonte
set
não são herdadas pelos subshells.Bothset
eshopt
opções não são herdadas pelos subshells.set
eshopt
?set -o
eshopt
são herdadas por subshells ((...)
,$(...)
componentes de pipeline). A herança de outrasbash
invocações depende de estarSHELLOPTS
ouBASHOPTS
não no ambiente.set
origina-se do casco de bourne (sh) e faz parte do padrão POSIX;shopt
no entanto, não é e é específico do casco de bourne-again (bash):fonte