Linux e Shell - O Shell é obrigatório?

8

Uma pergunta total para iniciantes.

Por que precisamos de um shell no Linux? Como exemplo, quando digito - encontre. -name xy * - Foi-me dito que o shell pega essa entrada e chama o comando find (certificando-se de que o curinga seja corretamente interpretado e tudo mais). Isso não pode ser feito sem o conceito de shell? ... se o shell acompanha os vários processos, isso não pode ser feito sem ele?

Além disso, por que eu posso digitar> ls xy * e obter uma saída adequada enquanto preciso escapar * com um \ in find - find. -name xy \ * O shell está fazendo a expansão de curinga para um e não para o outro executável?

Obrigado.


fonte
9
Usar o Linux sem shell é como dirigir a Ferrari 50 km / h no tráfego da cidade. Toda a diversão vai embora.
vava

Respostas:

23

Isso não pode ser feito sem o conceito de shell?

Bem não. Você precisa de algo que interprete sua intenção e invoque o programa apropriado. Essa coisa é chamada de concha.

EDIT: Para evitar confusão, "shell" não significa "interface de linha de comando". Em http://en.wikipedia.org/wiki/Shell_(computing) :

"Os shells do sistema operacional geralmente se enquadram em uma de duas categorias: linha de comando e gráfico. Os shells da linha de comando fornecem uma interface de linha de comando (CLI) para o sistema operacional, enquanto os shells gráficos fornecem uma interface gráfica do usuário (GUI). categoria, o objetivo principal do shell é invocar ou "iniciar" outro programa; no entanto, os shells frequentemente possuem recursos adicionais, como a exibição do conteúdo dos diretórios ".

Quanto à sua outra pergunta, o shell está realizando a expansão de caracteres curinga para os dois comandos, mas quando você está procurando por arquivos usando find, você deseja encontrar, e não o shell, para fazer a expansão, pois você deseja que ele seja feito nos locais que a localização está procurando dentro e não no local de onde foi invocado; portanto, você escapa do * para interromper a expansão do shell, para que o achado possa vê-lo.

sombra da Lua
fonte
então, você diz que no Windows o botão Iniciar é chamado de shell? :-)
5
Não é um uso comum, mas as GUIs são sem dúvida shells (pelo menos se executadas fora do kernel). O botão Iniciar é apenas uma característica do GUI ...
dmckee --- gatinho ex-moderador
O botão Iniciar é definitivamente algo que "interpreta sua intenção e invoca o programa apropriado". OTOH, shell Linux, pode ser chamado de recurso da TUI (Text User Interface).
11
@ Paul: Explorer, o programa que fornece o botão Iniciar é o shell do Windows. De fato, é um shell do Windows; pode ser substituído.
moonshadow
1
Sim, o botão Iniciar pode ser visto como um shell. Não é um shell interativo, mas mesmo assim um shell. Normalmente, porém, quando alguém diz "shell" que significa um prompt interativo (por exemplo, o prompt de comando no Windows é uma concha tradicional)
5

Obviamente, você pode fazer tudo através de uma GUI. Localizar arquivos do Windows (do XP e versões anteriores) é um pouco equivalente ao GUIsh do comando digitado.

Agora, por que os usuários UNIX (e Linux) gostam de shell? Como você pode obter a saída, alimente-a em outro programa e obtenha uma saída diferente. Por exemplo:

find | grep burek

Estes são dois comandos finde grepum alimenta o outro. findlista todos os arquivos nas pastas atuais e todas as filho, um por linha e grepimprime apenas as linhas que contêm burek.

Agora, existem outras coisas mais complexas, como:

ls -R | sort | uniq

ls -Rlista arquivos nas pastas atuais e filho e sortclassifica a saída. uniqentão nos dá apenas linhas únicas.

Agora, enquanto você pode codificar tudo isso em uma GUI, você pode rapidamente fazer coisas tão complicadas com a linha de comando que você normalmente não pode fazer com a GUI, a menos que você escreva sua própria Nesse caso, é mais rápido digitar na linha de comando, não é?

Bottomline: Se você perguntar isso, você não precisa. A linha de comando é inútil para você como um usuário comum. No entanto, a linha de comando é excelente para administradores de sistemas, desenvolvedores e aqueles que querem mexer com o computador de uma maneira rápida e rápida.

Ivan Vučica
fonte
1

Sim, você pode executar o comando find sem um shell - você precisaria de algum programa para iniciá-lo e de algum programa para exibir sua saída. Muitas vezes, você está usando recursos do shell, e esse comando precisará de um shell para interpretar a intenção.

por exemplo, tubulação, redirecionamento e globbing é um recurso do shell e precisará de um shell para interpretar. "find. -name myfile" não usa nenhum recurso de um shell e pode ser executado sem um shell. "find. -name myfile | sort> output" usa tanto o canal quanto o redirecionamento e você precisa de um shell para interpretar isso.

Quanto a escapar de xy *, há pouca diferença se for a entrada a ser encontrada ou a saída de uma redição, o shell a expandirá de qualquer maneira.

Se houver um arquivo chamado xyz no diretório atual

encontrar . -name xy * será executado como localizar. -name xyz, que provavelmente não é o que você deseja.

Se você encontrar. -name xy * e não há arquivo correspondente a xy * no diretório atual, ele será executado como localizador. -name xy *.

Da mesma forma, se não houver arquivo correspondente a xy * no diretório atual, ls> xy * criará um arquivo chamado xy *. Se houver um arquivo correspondente - digamos xyz, isso significa ls> xyz. Se houver vários arquivos correspondentes a xy *, ls> xy * falhará.

Leia mais http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

n
fonte
Modo de leitura onde?
Thomi 06/09/09
1

OSs não triviais não executam o interpretador de linha de comando no kernel.

Eles executá-lo como um programa, e esse programa é chamado um shell. A situação nas GUIs parece ser mista, mas pelo menos alguns SOs rodam fora do kernel também.

Agora, não há absolutamente nenhuma necessidade para o shell para o trabalho como o shell unix, mas você fazer precisa de uma interface.

dmckee --- gatinho ex-moderador
fonte
1

Para responder sua segunda pergunta ... o shell tentará expandir o que puder, sempre que puder, a menos que você o impeça. Escapar do * impede a expansão, que geralmente é necessária para o comando find.

Para não responder a uma pergunta com uma pergunta, como você saberia se o comando ls estava listando os arquivos devido a uma expansão da linha de comando ou porque o comando ls procurou legitimamente a listagem de diretório do sistema de arquivos? Por exemplo, eu poderia escrever um shell para loop como este:

for i in $(ls /home/mydir);

ou como

for i in /home/mydir/*;

eles acabam resultando no mesmo conjunto.

KFro
fonte
0
por que é que eu posso digitar> ls xy * e obter uma saída adequada enquanto
Preciso escapar * com um \ in find - find. -name xy \ * É
shell fazendo a expansão de curinga para um e não para o
outro executável?

O ponto de escapar '*' na chamada de localização é impedir que o shell faça a expansão. Ao escapá-lo, você garante que a localização veja os argumentos: ".", "-Name", "xy *". Se você não escapou do '*', a localização mostraria ".", "-Name", "xya", "xyz" (assumindo que o shell expanda "xy *" para "xya xyz", o que acontecerá se o único arquivos que iniciam xy são xya e xyz). Portanto, a resposta para sua pergunta é não, o shell não expande o '*' na sua chamada de localização porque você solicitou explicitamente que não escapasse.

William Pursell
fonte
0

O Shell no Linux é uma maneira conveniente e convencional de interagir com o sistema de arquivos no Linux e executar comandos com argumentos e com relação às variáveis ​​de ambiente. Ele fornece muitos recursos úteis, por exemplo, conectando a saída de um processo à entrada de outro, redirecionando fluxos de entrada / saída de / para arquivos, FIFOs, etc. Um shell é uma boa maneira de combinar facilmente vários programas pequenos, cada um deles fazendo uma tarefa relativamente pequena, para fornecer algo útil. Alguns desses programas (como find e ls) foram projetados para trabalhar com eles em um shell.

Para entender a expansão, lembre-se apenas de que uma palavra (sequência delimitada por espaço de caracteres aplanuméricos e -, e alguns outros símbolos), dado que ela contém *ou ?caracteres padrão, não é escapada ou colocada dentro das aspas ( ") ou apóstrofos ', é substituída por uma série de palavras delimitadas por espaço com nomes de arquivos que correspondem ao padrão. Assim como você teve uma palavra com um asterisco, após a expansão, você terá zero, uma ou várias palavras, que serão tratadas pelo bash como vários argumentos. Aí vem o design específico do lscomando: ele se encaixa perfeitamente nesse esquema quando usado ls foo*para exibir todos os arquivos que começam com "foo"! É expandido para algo como

ls foobar boobaz

e apenas imprime arquivos a partir de argumentos, verificando a existência e entrando em pastas, etc.

Mas essa é principalmente a questão da filosofia. Em outros sistemas, tudo emerge do botão "Iniciar" e da barra de tarefas. Alguns usuários estão bem com isso. Alguns tentam instalar um shell do tipo linux nesses sistemas. É uma questão de gosto, mas para programar scripts simples, que lidam com arquivos, o shell é extremamente conveniente.

P Shved
fonte
0

Para comandos interativos, o shell pode ser substituído pela GUI.

Mas o ponto principal do shell é que é uma linguagem de script: você pode criar programas inteiros que são executados em situações específicas (inicialização, abertura de sessão, todos os dias, ...). Este recurso não pode ser substituído por outras ferramentas.

mouviciel
fonte
E, claro, você pode agendar scripts shell comcron
Wuffers
0

Claro que você pode executar o Linux e nunca usar o shell. Prontamente, muitas distribuições Linux padrão oferecem ao usuário doméstico exatamente o que ele precisa, se quiser apenas verificar o facebook, ver fotos e enviar e-mail.

O Linux tem muitos profissionais, mas o shell é provavelmente o melhor. O shell permite o redirecionamento de E / S. É sobre isso que as pessoas falam quando se referem a pipes ("|"). Por exemplo:

Desejo conectar-me a uma lista de máquinas e realizar uma pesquisa sobre onde existe uma conta de usuário:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

Pode haver 0 hosts no hostnames.txt ou pode haver milhares. Esse script irá percorrer e fazer a pesquisa, espalhando as informações para o stdout.

O script pode ser muito criativo. Eu posso usar os caracteres "/ >>" para redirecionar entrada / saída de e para arquivos. Eu poderia pesquisar todas essas máquinas no script acima, enviar o nome do servidor de qualquer um que tenha o usuário para um arquivo e acompanhar outro script que conecta e executa alguma tarefa na conta do usuário (bloquear / desbloquear / redefinir pw / remover / adicionar grupo / etc).

Aprender. Para. Roteiro. =)

HayekSplosives
fonte