몇 줄의 문자(예: 수학 표현식을 단순화하기 위해)를 빠르게 입력한 다음 전체 내용을 삭제해야 하는 경우가 많습니다. 물론 내 텍스트 편집기에는 일반적으로 내가 할 수 있는 여러 실행 세션이 있습니다. 나는 또한 다음 시스템을 사용하고 있습니다. echo "
터미널에 입력하고(bash 실행) 완료되면 무엇이든 입력합니다 "
.
어제 나는 좀 더 우아한 것을 my에 추가하기로 결정 .bashrc
하고 다음 별칭을 만들었습니다.
# write junk on the terminal (stop with a line containing only "." )
# alias scratch="awk '/^\.$/{exit}'"
# alias scratch="sed -ne '/^\.$/q'"
alias scratch='grep -q "^\.$"'
위의 세 가지 변형이 동일한 작업을 수행하는 것을 볼 수 있습니다. 를 입력한 scratch
다음 입력하고 싶은 항목을 입력하고 마지막으로 .
(점)만 포함하는 줄로 끝납니다.
나는 이것에 매우 만족하지만 다음과 같은 변형도 생각했습니다.
alias scratch="cat - > /dev/null << ."
>
각 줄의 시작 부분에 초기 프롬프트가 표시되는 경우에도 동일한 작업을 수행합니다.
그런 다음 환경 변수를 사용하여 이 프롬프트를 변경하는 방법을 알고 싶었지만 PS2
완전히 작동하는 것을 얻을 수 없었습니다. 물론 PS2
완료되면 현재 프롬프트가 복원되어야 합니다.scratch
"임시" 세션 중에만 이 별칭 변형에 대한 힌트를 임의의 문자열로 설정하려면 어떻게 해야 합니까?
답변1
이것이 무엇에 유용한지(또는 당신이 좋아하는 어떤 편집기와 비교하여 nano
) 완전히 확신할 수는 없지만 vim
... 별칭이 필요합니까?
$ <<.
> foo
> bar
> baz
> .
길이 는 더 "
짧아지지만 오류 메시지가 표시됩니다.
$ "
> oh
> ah
> ui
> "
bash: $'\noh\nah\nui\n': command not found
참고로 이런 것들은 정말 사라지지 않습니다...
$ history
497 <<.
foo
bar
baz
.
이것이 귀찮다면 먼저 기록을 비활성화하거나 나중에 지우십시오.
(적어도 Bash의 경우) 상위 쉘로 설정해야 하기 때문에 사용자 정의 PS2 프롬프트에서는 이것이 어렵습니다. 서브쉘에서 설정하면 무시됩니다. 다음과 같이 명시적인 셸 인스턴스를 시작하면 이 문제를 해결할 수 있습니다.
$ PS1=@_ PS2=:_ bash --norc
@_<<.
:_hey
:_.
@_exit
$
그러나 이 시점에서는 전용 준비 및 삭제 프로그램을 작성하는 것이 더 합리적입니다.
PS2 프롬프트를 전혀 사용하지 않는 다른 방법:
$ while read -p ":-> " ; do : ; done
:-> hey
:-> how
:-> do
여기서 나갈 때 "."를 사용할 수 없다는 것뿐입니다. 그럼 쉽게 조건으로 추가할 수 있습니다...
$ alias scratch='(var=_; while read -r -p ":-> " var; do [ "$var" == . ] && break; done)'
$ scratch
:-> a
:-> b
:-> c
:-> .
Ctrl그러나 + 를 사용하여 EOF를 전송하여 종료할 수도 있습니다 D.
답변2
read
입력을 한 줄씩 읽는 데 사용됩니다 . 프롬프트를 지정할 수 있습니다. 다음 코드 스니펫은 줄을 읽고 줄에 단일 점 주위에 선택적 공백이 포함될 때까지 또는 빈 줄에서 Ctrl+를 누를 때까지 해당 내용을 무시합니다.D
scratch () {
local line
while [[ "$line" != "." ]] && read -r -e -p "scratch> " line; do :; done
}