왜 bash 기록 대체가 여전히 기본적으로 활성화되어 있습니까? [닫은]


17

bash가 여전히 기본적으로 히스토리 대체를 사용하는 이유를 아는 사람이 있습니까? 내이 .bashrc포함되었습니다 set +H많은 여러 해 동안 만 다른 사람들은 아직이 기능에 의해 물린 얻고있다.

거의 모든 사람들이 복사 - 붙여 넣기 기능을 갖춘 단말기를 사용하고있는 점을 감안 하고 컴파일 bash는 readline라이브러리 역사 치환은 기본적으로 활성화 된 경우에만 대화 형 쉘에서, 모든의 기능이 어떤 이유 정말 있는가? 모든 셸에서 기본적으로 비활성화되어 있어도 기존 스크립트는 손상되지 않습니다.

히스토리 대체가 실패한 이유를 모르는 경우이를 시도하십시오.

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(모든 스크립팅에 대해 기본적으로 비활성화되어 있고 실행하기 전에 결과를 확인하는 기능이있는 경우이 기능에 중대한 문제가있는 것은 분명합니다 shopt -s histverify.)

또한보십시오:


16
사람들은 역사 대체를 사용하지 않는다고 생각하는 것 같습니다. 매일 사용하고 있습니다. 나는 빨리 따라 찾을 ls -l foo/bar/baz/weeble.cppless !$비해 리콜 명령 및 편집 그것.
Martin Bonner는 Monica

2
@MartinBonner 활성화 할 수 있습니다. 문제는 여전히 존재하는 이유가 아니라 왜 기본적으로 활성화되어 있는지에 관한 것입니다.
Barmar

5
@Barmar : 물론입니다. 그러나 나의 요점은 그 질문이 전제되었다는 가정에 이의를 제기하는 것이었다.
Martin Bonner는 Monica

5
추론을 따를 경우 이스케이프 또는 인용이 필요한 것은 기본적으로 비활성화되어 있어야합니다. 포함 된 URL을 이스케이프하거나 인용해야하는 이유는 무엇 &입니까? 왜 파일이 ​​포함 된 파일 이름을 이스케이프하거나 인용해야 ?합니까? 이것이 문제라고 생각하는 사람들을위한 UI가 있습니다.
jcaron

3
나는 !$하루에 여러 번 사용 하며 !!꽤 자주 사용합니다. 나는 다른 역사 대체물을 많이 사용하지 않는다는 것을 인정해야하지만, 몇 년 동안 사용했던 쉘의 기본 동작이 갑자기 바뀌면 분명히 불행 할 것입니다.
jcaron

답변:


32

이미에 익숙하다면 bash, 이력 대체 패턴을 다루는 것이이 쉘에 특별한 다른 문자를 다루는 것보다 훨씬 더 무겁지 않을 것입니다. 그러나 쉘에 익숙하지 않거나 히스토리 대체 기능을 사용한 적이 없다면, 인용되지 않은 인용 부호 나 큰 따옴표로 묶인 문자열이이를 트리거 할 때 놀라 울 것입니다.

히스토리 대체가 사용 가능한 대화식 쉘에서 !문자는 특수 문자와 거의 같은 방식으로 $특별합니다. 즉, \작은 따옴표로 묶거나 문자열로 이스케이프하지 않는 한 어디에서나 가능 합니다.

반대로 $통해, 역사의 대체 여기-문서에 확장하지 않으며, 그들이 라인 지향하기 때문에, 그들은 추가 됩니다 대체가 인용되지 않은 상황 또는 이중 인용 맥락에 속하는 곳 (스캔 한 때 라인) 라인에서 발생 . 자세한 내용은이 버그 보고서를 참조하십시오 .

비 대화식 쉘 (스크립트)에서는 히스토리 대체가 비활성화됩니다. 기능에 "주요 문제"가있는 것이 아니라 쉘의 명령 히스토리 기능이 필요하지 않기 때문입니다. 스크립트에서 모든 명령을 저장하는 것은 $HISTFILE말이되지 않으며, 히스토리 대체도 스크립트에서 의존하고 싶은 것이 아닙니다.

대화식 쉘에서 기본적으로 활성화해야하는지 여부에 대해 토론 할 수 있습니다 ( 여기서는 토론 이 bash개발자 에게 큰 문제가 될 것이라고 확신하지는 않습니다 ). 대부분의 bash사용자가 히스토리 확장에 문제가 있다고 생각하는 것 같지만 귀하와 저 중 어느 누구도이를 사용하는 것이 얼마나 일반적인지 모릅니다.

유닉스 쉘은 개인의 필요와 취향에 맞게 쉘의 동작을 수정할 수 있습니다. 모든 대화식 쉘에 대한 히스토리 대체 기능을 끄 set +H려면 ~/.bashrc파일 에서 사용중인 작업을 계속 수행 하거나 bash개발자가 기본값을 변경하도록 로비하십시오. ).


2
@MikkoRantalainen 당신은 역사 대체가 대부분의 bash사용자가 사용 하는 것이 아니라고 생각하는 것 같습니다 . 우리 둘 다 그것이 얼마나 흔한 지 모른다고 생각합니다. 이것에 대해 강하게 느끼면 bash메일 링리스트에 기능 / 버그 요청을 제출하는 것이 좋습니다 . savannah.gnu.org/mail/?group=bash
Kusalananda를

8
권리. 문제는 실제로 역사 대체에 관한 것이 아니라 Bash의 큰 따옴표가 실제로 다른 언어에서 용어를 사용한다는 의미에서 인용이 아니라 특별한 종류의 괄호처럼 작동한다는 사실에 관한 것입니다. @MikkoRantalainen, Bash가 해석하고 싶지 않은 것을 작은 따옴표로 특별한 방식으로 넣는 습관을들이 십시오!
leftaroundabout

5
@leftaroundabout 해석의 의미에 달려 있습니다. 대부분의 언어는 출력을 위해 문자열에서 제어 문자를 해석합니다 (그러나 문자열을 섞을 때 쉘에서와 같은 방식으로 부여되지는 않음). Perl의 인용 규칙은 추가로 쉘의 변수와 매우 유사하게 작동합니다 (변수 보간). 다른 프로그래밍 언어와 마찬가지로 현재 사용중인 언어를 기억할 수 있으면 도움이됩니다.
Kusalananda

5
" ! 내 말이 그렇게 거의 사용되지 즉 특수 문자를 나는이 ... 그것은 다른 방법으로 주위 말할 것" !때문에 거의 사용되지 않는 정상 옆 WTFs을 울리는 - - 사람의 수하는 것은 훨씬 능가한다 밖으로 잡힐 것을 문자 여전히 역사를 대체하기 위해 그것을 사용하는 사람들의 수에 의해.
TripeHound

3
잘못된 인용으로 비난을 편향시키기 위해 -1. 대부분의 Bourne과 같은 쉘이나 스크립트 에는 특별한 !것이 아니기 때문에 사람들은 합리적으로 배울 수 있지만 경로 는 확장 되지는 않는 많은 경로가 있습니다 . 나는 Bourne과 같은 쉘에 익숙해졌고 , 대화식 쉘에서 빠른 원 라이너를 만들려고 할 때 역사 대체 와의 첫 만남 나에게 물렸다. Bourne과 같은 쉘을 이식 가능하고 스크립팅하는 데 능숙한 사람들은 종종을 사용할 때 적어도 한 번 물린 경우가 있습니다. bash"$my_var some text!!"$my_var!!busybox ashbashbash
mtraceur

9

히스토리 대체가 유용합니다. 예를 들어

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
그래서? 유용하다고 생각되면에서 사용할 수 있습니다 .bashrc.
Barmar


3
@Barmar 및 유용하지 않은 경우 비활성화 할 수 있습니다. 대칭이 어떻게 작동하는지 재미 있습니다.
hobbs

3
@hobbs 그것이 존재하는지 모른다면 어떻게 비활성화 하시겠습니까?
Barmar

2
이 답변은 기능이 유용한 이유 중 하나를 설명하는 데 효과적입니다. OP는 OP가 (그리고이 스택 교환에 관한 몇 가지 관련 질문을하는 사람들과 같은 다른 사람들이)이 행동이 놀라운 / 예기치 않은 것을 발견 하더라도이 유용성이 왜이 동작을 정당화 하기에 충분한 이해하고 싶다고 생각 합니다.
mtraceur

4

사회 / 문화 관성.

이 질문은 어떻게 인간-작업 문제 공간에 있으므로, 기능 이 기본적으로 켜져 있어야 하는지에 대한 의견을 제시하지 않고 그 각도에서 대답 할 것입니다.

시작하려면 상대방을 이해하기 위해 기능을 끄는 데 방해 된다고 느끼는 성가심이, 켜는 데 방해 가된다면 느끼는 성가심 이라고 생각하십시오. 기능.

위의 내용과 충분한 bash사용자가이 기능을 사용 하고 있다는 사실과 기본 기능을 제거하거나 기본적으로 해제 할 것을 제안하는 것은 이미 기본적으로 익숙한 사용자의 저항에 부응합니다.

또한, bash많은 사람들의 기본 셸 (안 단지 기본 로그인 또는 시스템 쉘 의미에서,하지만 심리적 인 의미에서). 쉘 인용에 대한 참조 프레임이 bash이면, 그것이 처음 배운 쉘이라면 !, 특별한 쉘 캐릭터 라는 사실 은 자연스럽고 자동적으로 느껴질 것입니다 (또는 적어도 처음 배울 때, 그것은 단지 포탄의 방식, 많은 사람들 사이에서 받아 들일 수있는 단 하나의 기발한).

그리고 당신이 그것에 대해 생각하면, 많은 bash사용자들이 긍정적 인 맥락 에서 역사 대체 구문을 접하게 될 것 bash입니다.

그것은 단지 다른 Bourne의 같은 당신이 물린 될 거라고 쉘의 주변 세계에서오고 !특별한 존재 하고 이 기능을 가진 적이 어디 한 후, 쉘에 사용하는 경우 때문에 첫 번째 : 이렇게 부정적으로 볼 의향이 될 당신이 서두르는 일을하려고 할 때 당신을 망칠 때 노출 될 것입니다.

TL : DR : 대부분의 사용자는 기본값 이 어떤 방식이든 강하게 신경 쓰지 않을 것입니다 . 일부 사용자는 기능을 좋아하고 이미 그런 식으로 사용할 수 있다는 장점이 있습니다. 그것을 극복하십시오.


2
아니요, 다른 껍질에서 올 때만 아닙니다. 나는이 기능을 수년 동안 알고 bash있었고 놀랍게 물렸다. 단일 인용 은 항상! 깨진 bash구현 으로 인해 작동하지 않기 때문입니다 .
Philippos

@Philippos 그것은 끔찍합니다 (정말 끔찍한 것은 아니지만 일종의 고민하는 부정적인 qualia). 이것을 지적 해 주셔서 감사합니다. 나는이 답변을 나중에 다시 방문하여 그것을 통합하는 좋은 방법을 생각한 후에 내 대답에 당신의 요점을 제시하려고 노력할 것입니다.
mtraceur

2

왜 bash 기록 대체가 여전히 기본적으로 활성화되어 있습니까?

많은 사람들이 그것을 사용하고 대화 형 bash 쉘을 사용하는 사람들 아마도 문제를 피하기위한 규칙을 알아야하며 일반적으로 상처보다 더 도움이된다는 것을 알게 될 것입니다.

내 .bashrc에는 수년간 set + H가 포함되어 있지만 다른 사람들은 여전히이 기능에 물 렸습니다.

따라서이 기능은 사용하지 않는 기능이므로 대다수의 사용자가 사용하지 않는 것은 아닙니다. 불이행에 대한 탄원을 할 수는 있지만 A) 관심 있는 사람들의 일부 와 B) 당신이 선호하는 사람들의 비율 을 살펴 봐야 합니다. 관심이 있고 마음에 들지 않는 사람들은 이미 사용 중지했을 수 있습니다. 새 컴퓨터에서 계정을 만들 때 변경하면 도움이됩니다. 그 사람들이 관리 하고 그것을 좋아한다 그들이 미래에 얻을 그들이 사용하는 모든 컴퓨터와 모든 계정에 자신의 설정을 업데이트해야합니다.

거의 모든 사람이 복사-붙여 넣기 기능이있는 터미널을 사용하고 있다고 가정하면

내 의견으로는 어리석은 옵션 ...

이 기능을 사용해야 할 이유가 있습니까? 모든 셸에서 기본적으로 비활성화되어 있어도 기존 스크립트는 손상되지 않습니다.

예, 사람들은 유용하다고 생각합니다. 방금 일어나서 채널을 변경할 수 있다는 점을 감안할 때 리모컨을 사용하는 용도는 무엇입니까?

(이 기능은 모든 스크립팅에 대해 기본적으로 비활성화되어 있고 실행하기 전에 결과를 확인하는 기능인 shopt -s histverify)에 중대한 문제가 있습니다.

역사는 실제로 스크립트에서 의미가 없지만 더 중요한 것은 보안 문제를 일으킬 수 있습니다. 귀하의 경우 작은 따옴표를 사용하여 문제를 피할 수 있습니다. 나는 이것이 나를 위해 문제를 일으킨 적이 있다는 것을 기억하지 못하기 때문에 '주요 문제'가 있다고 말할 수있는 방법을 모르겠습니다. 이로 인해 실제 문제가 발생 했습니까, 아니면 새 컴퓨터에서 기본값을 설정해야합니까?

실제로 돈을 벌고 싶다면 작은 따옴표를 이스케이프하거나 사용하는 것과 다른 점이 없습니다.

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
관련 질문을보십시오 (오른쪽 열). 대부분의 질문은 우연히이 기능에 영향을 미치며 쉘이 고장 났다고 가정합니다. 나는 실수로 잘못된 출력을 유발하는 문자 시퀀스를 사용했기 때문에 오래 전에이 기능에 대해 개인적으로 배웠습니다. 나는 구원되었을 것입니다 shopt -s histverify하지만 그것은 기본적으로하지 않았다. 또한 오류 메시지가 암호화되어 있고 ( "이벤트를 찾을 수 없음")이를 유발하는 문자 순서가 Google에 적용되기 어렵 기 때문에 스스로 원인을 파악하는 것은 매우 어렵습니다.
Mikko Rantalainen

1
$특별한 내부 와 같은 "범용"쉘 구문 기능은 "..."사람들이 쉘에 대해 가장 먼저 배우는 것 중 하나이지만, !특수 내부 "..."(대화식 모드에서만) 라는 사실 은 일반적으로 덜 알려져 있기 때문에 사람들은이 기능에 진정으로 물립니다. 즉시 / 명백하게 가르치지 않으며, bash구체적입니다. 또한 Bourne과 같은 쉘은 주로 스크립트 내 텍스트와 대화 형 쉘 텍스트 사이에서 대칭을 가지므로 일반적으로 서로 복사하여 동일하게 작동하도록 할 수 있습니다. 유일한 예외 중 하나입니다.
mtraceur

1
나는 탈출 또는 작은 따옴표를 사용할 필요보다 다른 표시되지 않습니다 에 대한 진정한는 zsh, 단일 인용 할 때 !항상하는 것은 아니지만을 위해 작동 bash구현이 생산하는 경우, 예상치 못한 결과 . 당신은 우리 가 규칙 을 알아야한다고 말합니다. 당신은 그 연결된 규칙을 알고 있습니까?
Philippos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.