esta questão pode ser um pouco terminológica.
Como um novo aluno do Linux, acho que muitos tutoriais mencionam comandos Linux/bash. No meu entender, os comandos são apenas vários programas e o bash é um shell como zsh, fish etc. no Linux. O Shell interpretará a entrada do usuário e chamará o programa correspondente.
Portanto, os comandos do Linux são coisas como cd
, mkdir
enquanto os comandos bash são um tanto específicos para a sintaxe do shell. Por exemplo, se alguém quiser, ele poderá construir um shell exigindo run cd
em vez de cd
apenas fazer a mesma coisa.
Meu entendimento é preciso?
PS: Acho que consigo entender o conceito de terminal/shell/linha de comando, que foi declarado em muitas outras questões, e acredito que esta questão seja diferente dessas.
Em suma, seu entendimento está correto. Os shells possuem vários componentes internos que replicam programas reais e que muitas vezes também são instalados como programas reais. Uma razão para fazer isso é o desempenho. Builtins não precisam de fork, o que os torna mais rápidos.
Eu não os chamaria de 'específicos da sintaxe do shell'. Builtins são usados e se comportam de maneira muito semelhante a comandos externos. Num caso irá chamar um programa externo e no outro uma função interna replicando um programa. Específicos da sintaxe do shell são coisas como
[[
which faz mais parte da sintaxe do shell e não um componente interno. É especialmente reconhecível por[[
permitir o uso>
de outros caracteres especiais do shell como 'argumentos' que normalmente, para um comando interno ou externo, configurariam um redirecionamento. (Observação: em scripts Shell, os redirecionamentos geralmente são adicionados após o comando e seu argumento, mas isso não é um requisito. A sintaxe permite isso a qualquer momento, inclusive entre os argumentos dos comandos.)Uma maneira independente de shell de usar o programa real em vez do embutido é usar o caminho completo, por exemplo,
/usr/bin/pwd
em vez de apenaspwd
. Ou dependendo do shell para desabilitar o embutido, por exemplo, para Bashenable -n pwd
.Também útil é o shell Zsh integrado,
where
que é uma versão estendidawhich
e mostra todos os locais onde um comando é encontrado, não apenas o primeiro.Por último, mas não menos importante, seu exemplo
cd
é uma escolha infeliz. Embora vários shell internos também existam como programas externos, há alguns que não existem e não podem. Os programas externos são executados separadamente do shell e não podem alterar o ambiente do shell.cd
deve alterar o diretório de trabalho atual. Se você implementá-lo como um programa externo, você apenas alterará o diretório de trabalho deste programa externo. Não é possível alterar o shell que o executa. Assimcd
, e muitos outros componentes internos precisam ser internos do shell.Ambos são termos muito ambíguos e imprecisos.
Linux é um kernel de sistema operacional, que é um arquivo ELF monolítico com vários módulos carregáveis dinamicamente.
De certa forma, você poderia dizer que o Linux é um comando, pois seu carregador de boot o invoca para inicializar seu sistema operacional baseado em Linux.
O kernel do Linux vem com vários comandos, principalmente scripts, para ajudar a construí-lo e sua documentação.
Existem vários outros softwares fornecidos em kernel.org, como o pacote util-linux, que compreende vários comandos, alguns dos quais são específicos do Linux, pois fazem uso de API específica do Linux e não compilam para outras operações. grãos.
Existem outros softwares específicos do Linux e não afiliados à equipe de desenvolvimento do Linux nem disponibilizados no kernel.org, como o
systemd
, um dos muitos sistemas init usados em sistemas operacionais baseados em Linux.Depois, há vários sistemas operacionais que usam Linux como kernel e fornecem (distribuem) software desenvolvido para Linux. Esse é o seu Debian, OpenSuse, Arch Linux, Ubuntu, etc., ao qual você pode querer incluir coisas como Android e ChromeOS ou o sistema operacional rudimentar em sua lâmpada inteligente.
Eles também são chamados de distribuições Linux porque distribuem o Linux e o software que o acompanha para formar um sistema operacional completo, como o BSD, que a Berkeley Software Distribution fez antes deles (e ainda o faz, embora o BSD tenha se dividido em diferentes ramos desde então).
A maior parte do software que eles distribuem não é escrita por esses distribuidores. O principal valor agregado desses distribuidores são os sistemas de empacotamento (feitos de software que eles produzem como
apt
,dpkg
,yum
,zypper
,pacman
...), a construção (para aqueles que não são apenas baseados na fonte) e distribuição desses pacotes, a manutenção daqueles pacotes em um teste estável e seguro (para aqueles que não são lançamentos contínuos) e para fornecer um sistema útil e consistente com uma interface de usuário utilizável que, para os não incorporados, pode ser adaptada a muitos casos de uso diferentes.Uma diferença com os BSDs é que muito do software do BSD é desenvolvido pelo BSD, não apenas o kernel. Em particular, a biblioteca C e o software principal são feitos internamente, enquanto em sistemas baseados em Linux, a maior parte do software é software portátil não afiliado ao Linux e que pode ser usado em um grande número de kernels.
Em particular, a biblioteca C e o software principal em distribuições genéricas do Linux geralmente vêm do sistema operacional GNU.
Alguns desses distribuidores, como o Debian, estão disponíveis com o mesmo software desenvolvido para outros kernels, como o do FreeBSD, Illumos ou GNU Hurd. E vários sistemas operacionais não baseados em Linux incluem software do projeto GNU ou do freedesktop, comumente também disponível em distribuições Linux.
Portanto, "comando Linux" é bastante vago, pois pode significar
say "Hello World";
em perl oubreak main
em gdb pode-se dizer que é um comando do Linux seperl
forgdb
executado em um sistema operacional baseado em Linux.O termo comando Bash (o próprio bash sendo o shell do sistema operacional GNU e não afiliado de nenhuma forma ao Linux além do Linux é um dos muitos kernels para os quais pode ser construído) pode significar de forma semelhante:
sh
especificação da linguagem POSIX que inclui itens como comandos simples, comandos compostos (como umfor...do...done
loop), definições de funções...cd
, ou palavras-chaveset
,echo
como aquelas usadas nofor...do...done
loop.Na prática, porém, descobri que ambos os termos geralmente eram usados para significar código que você executaria a partir de um shell em sistemas operacionais baseados em GNU/Linux (geralmente não incorporados, como Android ou baseados em busybox), em um emulador de terminal, para as tarefas que você geralmente faria a partir daí. "bash" principalmente porque geralmente é o shell interativo do usuário padrão. Como "bash" não é específico do Linux, "comando bash" geralmente remove a conotação Linux do significado e pode significar qualquer código shell executado em qualquer sistema onde o bash esteja disponível.
Correto. Para generalizar, qualquer ferramenta baseada em linha (baseada em terminal) que interaja com o usuário pode ser um shell. Não precisa ser uma linha de comando, mas geralmente é.
Sim
É aqui que acredito que a terminologia começa a ficar confusa.
cd
é um shell integrado que representa a chamada do sistema do kernel Linux para alterar o diretório de trabalho do processo atual. Para uso interativo de linha de comando, ele deve ser implementado como um shell integrado, mas para uma interface de festival a experiência do usuário pode ser implementada de forma diferente.mkdir
é um comando (não um shell integrado) para instruir o kernel do Linux a criar um diretório.Sim. Mas nessa situação específica, a operação de alteração de diretório precisaria ser executada diretamente pelo seu processo shell, pois as mudanças de estado em um processo filho (um comando sendo executado) não afetam o processo pai (ou seja, o shell). Isso explica a diferença necessária entre um shell integrado e um executável normal que atua como um comando.
O terminal é uma emulação de software de um dispositivo físico (em sua maioria obsoleto) que fornece um meio para você acessar e usar um shell ou outra ferramenta de linha de comando. O shell de um usuário não precisa ser uma linha de comando; poderia ser um sistema baseado em menu ou um explorador de arquivos de texto como Midnight Commander (
mc
)