저는 많은 질문, 답변, 댓글이 재치보다는 대본 작성에 대한 경멸(때로는 두려움)을 표현하고 있음을 확인했습니다. 그래서 나는 알고 싶습니다:
언제, 왜 "한 줄"이 아닌 독립형 스크립트를 작성해야 합니까? 혹은 그 반대로도?
두 가지의 사용 사례와 장단점은 무엇입니까?
일부 언어(예: awk 또는 Perl)가 다른 언어(예: Python)보다 한 줄짜리 언어에 더 적합합니까? 그렇다면 왜 그렇습니까?
그것은 단지 개인적인 선호의 문제입니까, 아니면 주어진 상황에서 둘 중 하나에 대해 글을 써야 할 타당한(즉, 객관적인) 이유가 있습니까? 이러한 이유는 무엇입니까?
정의
one-liner
: 입력하거나 붙여넣은 일련의 명령쉘 명령줄에 직접 입력. 일반적으로 배관 및/또는sed
,awk
및 /또는 또는 와perl
같은 도구를 사용하는 작업 이 포함됩니다 .grep
cut
sort
명령줄에서 직접 실행하는 것은 길이와 형식에 독립적인 정의 기능입니다. "한 줄"은 모두 한 줄에 있을 수도 있고 여러 줄일 수도 있습니다(예: sh for 루프, 삽입된 awk 또는 sed 코드, 가독성을 위해 줄 바꿈 및 들여쓰기 포함).
script
: 해석된 언어로 된 일련의 명령파일에 저장, 그런 다음 실행합니다. 스크립트는 완전히 하나의 언어로 작성될 수도 있고, 다른 언어의 여러 "한 줄짜리"를 사용하는 쉘 스크립트 래퍼일 수도 있습니다.
나는 나만의 답변을 갖고 있지만(나중에 게시할 예정) 이것이 단지 내 개인적인 의견이 아닌 주제에 대한 정식 Q&A가 되기를 바랍니다.
답변1
실제 경험을 바탕으로 한 또 다른 답변입니다.
프롬프트에서 직접 작성할 수 있는 "폐기" 코드라면 한 줄의 코드를 사용하겠습니다. 예를 들어 다음을 사용할 수 있습니다.
for h in host1 host2 host3; do printf "%s\t%s\n" "$h" "$(ssh "$h" uptime)"; done
코드를 저장할 가치가 있다고 생각되면 스크립트를 사용하겠습니다. 이 시점에서는 파일 상단에 설명을 추가하고, 오류 검사를 추가하고, 버전 제어를 위해 코드 저장소에 체크인할 수도 있습니다. 예를 들어, 서버 그룹의 가동 시간을 확인하는 것이 반복해서 사용하는 유용한 기능이라고 결정했다면 위의 줄은 다음과 같이 확장될 수 있습니다.
#!/bin/bash
# Check the uptime for each of the known set of hosts
########################################################################
#
hosts=(host1 host2 host3)
for h in "${hosts[@]}"
do
printf "%s\t" "$h"
uptime=$(ssh -o ConnectTimeout=5 -n "$h" uptime 2>/dev/null)
printf "%s\n" "${uptime:-(unreachable)}"
done
요약하면 다음과 같이 말할 수 있습니다.
하나의 선
- 특정한 일회성 목적을 위해 작성된 간단한 코드(예: "몇 가지" 명령문)
- 필요할 때 코드를 빠르고 쉽게 작성할 수 있습니다.
- 일회용 코드
스크립트
- (아마도) 한두 번 이상 사용될 코드
- 여러 문이 필요한 복잡한 코드
- 다른 사람이 유지 관리해야 하는 코드
- 다른 사람들이 코드를 이해할 수 있도록 하라
- 무인으로 실행되는 코드(예: from
cron
)
여기서 질문이 많이 보이는데요UNIXSE특정 작업을 수행하기 위해 농담을 요청하세요. 위의 예를 보면 두 번째 예가 첫 번째 예보다 이해하기 쉬우므로 독자가 더 많은 것을 배울 수 있다고 생각합니다. 하나의 솔루션은 다른 솔루션에서 쉽게 파생될 수 있으므로 (향후 독자를 위한) 가독성을 위해 .
답변2
쓰다스크립트언제:
- 코드가 더 필요해
- 당신은 가독성을 중요하게 생각합니다
- 코드의 기능을 보여주기 위해 주석을 추가하는 것이 필요하거나 유용합니다.
- 매개변수를 전달해야 합니다.
- 스크립트가 자체 환경(변수 등)에서 실행되기를 원합니다.
- 좀 더 복잡한 목적으로 코드를 재사용/적용할 수 있습니다.
쓰다한 줄언제:
- 적은 양의 코드만 필요합니다.
- 현재 쉘에 정의된 변수에 접근하고 싶습니다.
- 빠르고 더러운 솔루션이 필요합니다
답변3
필요한 일련의 명령이 매우 짧거나 더 큰 파이프라인 또는 명령 별칭의 일부로 사용할 수 있는 결과를 생성하는 경우 좋은 한 줄 명령이 될 수 있습니다.
기본적으로, 내 생각에 농담은 일반적으로 문제에 대해 잘 알고 있는 숙련된 시스템 관리자가 사용하는 명령을 그다지 많이 생각할 필요 없이 그 자리에서 적어 둘 수 있는 것입니다.
줄이 너무 길어지거나 매우 간단한 조건 또는 루프 이상이 포함된 경우 일반적으로 가독성을 높이기 위해 여러 줄 스크립트나 셸 함수로 작성하는 것이 가장 좋습니다. 또한, 계속해서 사용할 내용이나 다른 사람들이 사용할 내용(그리고 문제를 해결할 수 있는 내용)을 작성하는 경우 시간을 들여 솔루션을 명확한 형식으로 작성해야 합니다. ) 검토, 스크립트 양식.
Python에서 들여쓰기는 구문의 일부이므로 코드 줄을 작성하면 실제로 언어 기능을 최대한 활용하지 못합니다.
Perl과 awk의 한 줄 문에는 정규식의 기본 기능을 사용하는 경우가 많습니다. 그러나 일부 사람들은 정규식을 쓰기 전용 언어라고 부르는데, 이는 완전히 비합리적인 것은 아닙니다. 여러 줄로 된 스크립트를 작성하면 특정 정규 표현식이 수행해야 하는 작업을 설명하는 주석을 작성할 수 있으며, 이는 다른 작업을 수행한 후 6개월 후에 스크립트로 다시 돌아올 때 매우 도움이 될 수 있습니다.
이것은 본질적으로 매우 의견 중심적인 질문입니다. 허용 가능한 수준의 복잡성과 가독성과 간결함 사이의 균형을 고려하는 것입니다. 이 모든 것은 개인 판단에 크게 좌우됩니다. 언어 선택도 개인적인 문제에 따라 달라질 수 있습니다. 특정 언어가 이론적으로 특정 문제에 가장 적합하지만 해당 언어에 익숙하지 않고 이미 다른 언어의 문제를 해결하는 방법을 알고 있는 경우 친숙한 언어를 선택할 수 있습니다. 비록 솔루션이 기술적으로 다소 비효율적일지라도 최소한의 노력으로 작업을 신속하게 완료하는 것입니다.
최고종종 적충분하다, 여기에 매우 적용 가능합니다.
Perl에 익숙하다면 TMTOWTDI에 대해 들어보셨을 것입니다.이를 수행하는 방법은 여러 가지가 있습니다.
답변4
나는 한 줄의 코드를 임시 개발 도구로 보고 사용하여 내 요구 사항을 충족할 때까지 반복적으로 편집하거나 하위 명령이 작동하는 방식을 어느 정도 미묘하게 이해할 수 있습니다.
그런 다음 조사 중인 주제에 대한 텍스트 파일에 주석을 달고 주석을 달거나 스크립트로 정리하여 개인 bin PATH에 넣어 추가 개선, 매개변수화 등에 사용할 수 있습니다. 다른 변경 사항이 없거나 스크립트를 다시 사용하지 않더라도 더 쉽게 읽을 수 있도록 줄이 분리되는 경우가 많습니다.
각 터미널과 각 원격 로그인 등에 대해 별도의 기록을 사용하여 쉘 기록을 5000줄 이상으로 설정했습니다. 나는 몇 주 전에 개발했고 더 이상 필요하지 않다고 판단한 한 줄 명령을 이 기록에서 찾을 수 없어서 내 전략을 찾을 수 없다는 것이 싫습니다.
때로는 일부 하드웨어를 구성하는 등의 작업을 수행하기 위해 전체 명령 세트가 필요합니다. 모든 명령을 기록에서 복사하고 최소한의 정리 작업을 수행한 다음 RUNME
I와 같이 쉘 스크립트에 추가합니다. 주석은 동일합니다. , 그리고 거의 항상 다른 사람들이 재사용할 수 있습니다. (이것이 내가 그렇게 고통스럽게 구성하기 위해 GUI만 제공하는 도구를 찾는 이유입니다.) 한 번 하고 싶은 일을 5번 수행해야 하는 경우가 많기 때문에 이것이 효율성 면에서 엄청난 이득이라고 생각합니다. .