기능적인 유닉스 쉘이 있습니까?

기능적인 유닉스 쉘이 있습니까?

나는 (정말로) 함수형 프로그래밍의 초보자이지만(실제로는 Python을 사용해서만 접했습니다) 쉘 환경에서 일부 목록 집약적 작업에 대한 좋은 접근 방식인 것 같습니다.

나는 다음과 같은 일을 하고 싶습니다:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

이런 종류의 기능을 갖춘 Unix 쉘이 있습니까? 또는 Python 내에서 쉽게 쉘 액세스(명령, 환경/변수, readline 등...)를 허용하는 기능이 있을 수도 있습니다(파이썬의 대화형 인터프리터를 bash 대신 사용하는 아이디어입니다).

편집하다:

어쩌면 비교 예가 명확해질 것입니다. 다음으로 구성된 목록이 있다고 가정해 보겠습니다.디렉토리/파일:

$ FILES=( build/project.rpm build/project.src.rpm )

그리고 저는 정말 간단한 작업을 하고 싶습니다. 모든 파일을 다음으로 복사합니다.거리/그리고 시스템에 설치하십시오(빌드 프로세스의 일부임).

배시 사용:

$ cp ${파일[*]} dist/
$ cd dist && rpm -Uvh $(for f in ${files[*]}; do basename $f; done))

"파이썬 셸" 접근 방식 사용(주의: 이는 가상의 코드입니다):

$ cp [ os.path.join('dist', os.path.basename(file)) for file in FILES ] 'dist'

차이점을 알 수 있나요? 그것이 내가 말하는 것입니다. 아직 이런 종류의 기능이 내장되어 있으면 어떻게 쉘을 종료할 수 없나요? 파일 목록, PID 목록, 모든 항목 목록과 같은 매우 일반적인 작업인 경우에도 셸에서 목록을 처리하는 것은 정말 고통스럽습니다.

그리고 정말 정말 중요한 점은 모두가 이미 알고 있는 구문/도구/기능(sh 및 Python)을 사용한다는 것입니다.

IPython은 좋은 방향으로 연결되지만 너무 커집니다. var 이름이 '$'로 시작하면 이렇게 하고, '$$'로 시작하면 그렇게 합니다. 구문이 "자연스럽지" 않으므로 규칙과 "해결 방법"이 많습니다( [ ln.upper() for ln in !ls ] --> 구문 오류).

답변1

거기에구성표 셸그것은 아마도 당신이 찾고 있는 것과 매우 유사할 것입니다. 나는 그것을 직접 사용하지 않았습니다.

업데이트 :

방금 직접 설치해서 사용해봤습니다. scsh는 실제로 유용한 대화형 쉘이라기보다는 대화형 Scheme 해석기 및 스크립팅 언어에 더 가까운 것으로 보입니다. 그냥 입력할 수는 없습니다.

echo hello

구문은 다음과 같습니다

(run (echo hello))

그것을 찾는데 몇 분의 인터넷 검색이 필요했습니다. 첫 번째 예여기이다:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

이는 다음과 같이 번역됩니다.

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

하지만 그것은 실행 방법을 알려주지 않습니다.단순한쉘 명령.

이 FAQ 항목말한다:

4.6 scsh를 대화형 쉘로 사용할 수 있습니까?

기술적으로는 다음과 같이 할 수 있습니다. "scsh" 명령을 실행하면 모든 scsh 기능을 사용할 수 있는 Scheme 48 세션에 들어갈 수 있습니다. 그러나 이는 확실히 대화형 작업에는 적합하지 않습니다. 명령줄 편집, 명령줄 기록, 파일/함수 이름 완성, 간결한 구문 등이 없습니다.

이러한 문제를 완화하기 위해 Martin Gasbichler와 Eric Knauel은 scsh 위에서 실행되고 편안한 대화형 환경을 제공하는 Commander S를 작성했습니다. 새로운 기능 중 하나는 많은 Unix 명령의 출력을 이해할 수 있고 사용자가 이를 유용한 방식으로 검색하고 조작할 수 있다는 것입니다. Commander S에 대한 자세한 내용은 이를 설명하는 문서에서 찾을 수 있습니다. http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf Commander S를 구하고 설치하는 방법에 대한 지침은 scsh 웹 사이트에서 확인할 수 있습니다.http://www.scsh.net/resources/commander-s.html

어쩌면 그게 진짜 답일 수도 있겠네요.

답변2

질문에 직접 답변하는 카테고리에는ES 쉘이는 Bash 및 Zsh 등의 기능적 대체를 위한 것입니다.

둘째, 보다 기능적인 표준 쉘을 작성하는 데 도움이 되는 범주에서는 파이프밀 기술을 배우는 것을 고려하십시오.

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

첫 번째 while 루프는 함수형 keep(루프에서 나오는 null이 아닌 값만 전달)이고 두 번째는 each(부작용에 대해서만 맵)입니다.

이것은 포탄의 fp를 엄청나게 향상시킵니다.

쉘에서 더 많은 fp 스타일로 많은 것을 표현하는 것이 가능하지만, 그렇게 쉽지는 않습니다. 우리 모두가 조개껍데기를 이렇게 많이 사용하고 있음에도 불구하고, 더 좋은 조개껍데기를 만드는 데에는 별 관심이 없는 것 같습니다.

답변3

표준 Bourne 스타일 쉘( sh, bash, ksh등)을 사용하면 이미 다음을 수행할 수 있습니다.

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

do( 및 앞에 세미콜론이 필요하다는 점에 유의하십시오 done.) 또한 bash다른 쉘 에서 $repo명령에 한 번만 나타나는 경우 다음과 같이 작성할 수 있습니다.

git clone $host/{repo1,repo2,repo3}

답변4

Scheme Shell, scsh는 정말 좋습니다.

Keith Thompson이 지적했듯이 이는 대화형 쉘로는 유용하지 않습니다(Commander S는 흥미로운 실험처럼 보이지만). 대신, 모든 POSIX 바인딩이 유용한 상황(다른 Unix 애플리케이션을 호출하려는 경우 포함)에 탁월한 프로그래밍 언어입니다. 수십 줄이 넘는 쉘 스크립트는언제나아무리 깔끔하게 작성하더라도 해킹된 것처럼 느껴집니다 sh. 대조적으로 scsh를 사용하여 중요한 프로그램을 작성하는 것을 방해하는 것은 없습니다.

scsh는 아주 컴팩트하지는 않지만(간결함은 sh 계열 언어의 강점이자 약점입니다) 강력합니다.

크고 작은 작업에 유용하고 실용적이기 때문에 scsh는 체계를 파악하는 좋은 방법입니다(비록 그것이 당신의 목표라면 요즘에는 바로 Racket으로 가는 편이 나을 수도 있습니다).

함수형 언어의 장점은 목록 집약적인 작업에만 국한되지 않습니다(그의 역사 때문에 데이터 구조로서 목록을 선호하는 경향이 있음). 일단 올바른 음료를 마시면 프로그램을 작성하는 정말 강력한 방법입니다. 지원.

sh 스타일 쉘이 기능적이라는 의미는 없으며 Python은 람다 함수가 있다는 한계적인 의미에서만 기능적입니다.

관련 정보