
Sou (realmente) novato em programação funcional (na verdade, só tive contato com ela usando python), mas parece ser uma boa abordagem para algumas tarefas com uso intensivo de lista em um ambiente shell.
Eu adoraria fazer algo assim:
$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]
Existe algum shell Unix com esse tipo de recurso? Ou talvez algum recurso para permitir fácil acesso ao shell (comandos, env/vars, readline, etc...) de dentro do python (a idéia é usar o interpretador interativo do python como um substituto para o bash).
EDITAR:
Talvez um exemplo comparativo esclarecesse. Digamos que eu tenha uma lista composta pordiretório/arquivo:
$ FILES=( build/project.rpm build/project.src.rpm )
E quero fazer uma tarefa bem simples: copiar todos os arquivos paradist/E instale-o no sistema (faz parte de um processo de construção):
Usando bash:
$ cp ${arquivos[*]} dist/ $ cd dist && rpm -Uvh $(for f in ${files[*]}; do basename $f; pronto))
Usando uma abordagem de "shell python" (cuidado: este é um código imaginário):
$ cp [os.path.join('dist', os.path.basename(file)) para arquivo em ARQUIVOS] 'dist'
Você consegue ver a diferença? É disso que estou falando. Como ainda não é possível sair de um shell com esse tipo de coisa integrada? É muito chato lidar com listas no shell, mesmo sendo uma tarefa tão comum: lista de arquivos, lista de PIDs, lista de tudo.
E um ponto muito, muito importante: usar sintaxe/ferramentas/recursos que todo mundo já conhece: sh e python.
O IPython parece estar em uma boa direção, mas está inchado: se o nome da var começar com '$', ele faz isso, se '$$' ele faz aquilo. Sua sintaxe não é "natural", tantas regras e "soluções alternativas" ( [ ln.upper() for ln in !ls ]
--> erro de sintaxe)
Responder1
Há umEsquema Shellisso provavelmente está muito próximo do que você está procurando. Eu não usei isso sozinho.
ATUALIZAR :
Acabei de instalar e tentei sozinho. Parece que o scsh é mais um interpretador de esquema interativo e uma linguagem de script do que um shell interativo realmente útil. Você não pode simplesmente digitar
echo hello
a sintaxe parece ser
(run (echo hello))
e levou vários minutos pesquisando no Google apenas para descobrir isso. O primeiro exemploaquié:
gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &
que se traduz em:
(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))
mas isso não lhe diz como executar umsimplescomando shell.
4.6 Posso usar o scsh como um shell interativo?
Bem, tecnicamente você pode: basta executar o comando "scsh" e você entrará em uma sessão do Scheme 48 com todas as funções scsh disponíveis. No entanto, isso definitivamente não é adequado para trabalho interativo: não há edição de linha de comando, histórico de linha de comando, conclusão de nome de arquivo/função, sintaxe concisa, etc.
Para aliviar esses problemas, Martin Gasbichler e Eric Knauel escreveram Commander S, que roda em cima do scsh e fornece um ambiente interativo confortável. Uma de suas novas características é que ele pode compreender a saída de muitos comandos Unix e permite ao usuário navegar e manipulá-los de maneiras úteis. Mais informações sobre o Commander S podem ser encontradas no artigo que o descreve: http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf Instruções sobre como obter e instalar o Commander S estão disponíveis no site do scsh:http://www.scsh.net/resources/commander-s.html
Então talvez essa seja a verdadeira resposta.
Responder2
Na categoria de responder diretamente à pergunta, está oConcha ESque pretende ser um substituto funcional para Bash e Zsh etc.
Em segundo lugar, na categoria de ajudá-lo a escrever um shell padrão mais funcional, considere aprender a técnica de pipemill:
who | while read username
do
cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
echo "you have an answer on superuser.com" | mail -s "well done" $username
done
O primeiro loop while é funcional keep
(passa apenas os valores não nulos que saem do loop) e o segundo é um each
(mapa apenas para efeitos colaterais).
Este é um tremendo impulso para FP em shells.
É possível expressar muitas coisas em um estilo mais fp em um shell, mas não é tão fácil quanto poderia ser. Parece que não há muito interesse em fazer conchas melhores, embora todos nós as utilizemos tanto.
Responder3
Os shells padrão do estilo Bourne ( sh
, bash
, ksh
, etc.) já permitem:
for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done
(Observe a necessidade de ponto e vírgula antes de do
e done
.) Além disso, em bash
e em outros shells, se $repo
aparecer apenas uma vez no comando, você pode escrever:
git clone $host/{repo1,repo2,repo3}
Responder4
Scheme Shell, scsh, é muito bom.
Como observa Keith Thompson, não é útil como um shell interativo (embora o Commander S pareça um experimento interessante). Em vez disso, é uma excelente linguagem de programação para contextos onde é útil ter todas as ligações POSIX - isso inclui casos em que você deseja chamar outros aplicativos Unix. Um shell script com mais de algumas dezenas de linhassempresinta-se como um hack, não importa o quão bem você escreva sh
; por outro lado, nada impede você de escrever programas significativos usando scsh.
scsh não é muito compacto (a brevidade é tanto o ponto forte quanto o ponto fraco das linguagens da família sh), mas é poderoso.
Por ser útil e prático para tarefas pequenas e grandes, o scsh é, aliás, uma boa maneira de se familiarizar com um esquema (embora, se esse for o seu objetivo, você também possa ir direto para o Racket, atualmente).
As vantagens das linguagens funcionais não são apenas para tarefas com uso intensivo de listas (embora, devido ao seu histórico, elas tendam a favorecer as listas como estrutura de dados) - é uma maneira realmente robusta de escrever programas, uma vez que você bebe a bebida certa. ajuda.
Não há nenhum sentido significativo em que os shells no estilo sh sejam funcionais, e o Python é funcional apenas no sentido marginal de que possui uma função lambda.