fc
명령이며, 내장 된 역사의 명령을 편집 및 다시 실행하기 위해 만든 bash 쉘에서이.
그것은이다 너무 Cygwin에서에있는 그리고 내가 테스트하는 모든 리눅스 배포판에서 작동합니다 :
fc -s '\'='/' -1
몇 가지 설명
왜 "대체 실패"를 받고 있는지에 대한 몇 마디
s
수정자가 백 슬래시 문자의 대체 (아직)를 구현하지 않은 것 같습니다 \
. 이스케이프 문자 입니다. bash 기록 확장의 gnu 버전 코드와 같은 코드를 볼 수 있어야합니다 (그러나 위의 명령이 수행하려고하는 것을 얻었습니다 ... 그래서 나는 게으 릅니다 ....).
몇 가지 참고 사항 :
우리는 그것이 작동하는 각 RegEx를 사용할 것이라고 생각 sed
하지만, 보장되지는 않습니다. 백 슬래시는 확장의 이스케이프 문자이며 문제가 있습니다. 또한 확장 동작은 shopt
옵션 과 관련이 있으므로 사례별로보아야합니다.
cd C:\Foo\Bar
bash 쉘에 문자열을 붙여 넣으면 확장되어 인터프리터에 다음과 같이 나타납니다 cd C:FooBar
. 이 형식으로 $_
내부 변수에도 저장됩니다 .
대신 붙여 넣을 경우, cd "C:\Foo\Bar"
또는 cd 'C:\Foo\Bar'
에 $_
변수 당신이 찾아야한다 C:\Foo\Bar
.
전체 행을 읽은 직후 히스토리 확장이 수행되기 때문에 쉘이 단어를 나누기 전에 약간의 bashism 을 사용하여 시작하는 경향 이있을 수 있습니다 ( 예 : :p
또는 :q
, ""
, 파싱 등 ...)
!!:0 ${_//\\/\/}
경로와 파일 이름 으로 게임 을 시작 하는 것이 안전하지 않다는 것을 기억하는 순간입니다 . 특히 파일 이 Windows 클립 보드에서 온 경우 (일반적으로 구문 분석 하지 않는 이유는 무엇 입니까?ls
페이지를 읽으 십시오. 파일 이름과 디렉토리 이름에 대한 올바른 문자로 공백과 줄 바꿈 ...).
또한 마우스로 캡처 한 텍스트 를 붙여 넣으면 선행 공백도 붙여 넣을 수 있습니다. 이것은 명령이 기록에서 끝나는 것을 피할 수 있습니다 (쉘 옵션에 따라 다릅니다 ...). 그렇다면 다음 !!
은 통제되지 않는 명령입니다 ... ( 다른 답변 의 예 참조 ).이것은 불필요한 유형의 위험 입니다.
결론
히스토리 확장 은 히스토리 목록의 단어를 입력 스트림에 도입하여 명령을 쉽게 반복하고, 이전 명령의 인수를 현재 입력 행에 삽입하거나, 이전 명령의 오류를 빠르게 수정합니다.
쉽지 않다면 우리가 잘못하고 있다고 생각하기 시작합니다. ;-)
광고 구역 : 작은 실험
histverify
셸에서 활성화 했습니다 ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
그때 눌러 Enter과 같이 확인 확장을 나는 발견
echo D:\Foo\Bar {1,2}A
그런 다음 Enter다시 누르면 에코가 울립니다.
D:FooBar 1A 2A
이것은이 있음을 나타내는 것 같다 substitution failed
의 전에 처리 역사 확장에 생성되는 중괄호 확장 , 그래서 무엇보다도 먼저 , 그리고 확인하는 것 s
역사 수정이 (아직)하지 않았다의 대체 처리 \
진정한 정규식으로 문자를. ..
cd 'C:\foo\bar'