간단하게 글을 쓰려고 해요이전에 (실수로) 영어가 아닌 레이아웃으로 작성된 명령을 가져와 모든 것을 올바른 기호로 변환하고 실행하는 스크립트. 나는 그것을 사용하고 있다헤비스트라이크 4.3.11.
내 현재 코드는 다음과 같습니다(저는 프로그래머가 아니며 일반적인 사용성을 위해 이것을 배우려고 노력하고 있습니다).
echo !! | sed -e "y/first-set-of-symbols/second-set-of-symbols/" | bash
문제는 파일에서 스크립트를 실행하면 다음과 같은 결과가 나온다는 것입니다.bash: 1행: !!: 명령을 찾을 수 없음"하지만 전체 명령을 복사하여 붙여넣으면 예상한 대로 작동합니다. 스크립트 파일의 에코 부분을 "echo test-command"와 같은 것으로 변경하면 스크립트를 실행할 때 동일한 동작이 수행됩니다. 안에.
누군가 내가 이유를 이해하도록 도와줄 수 있나요? 여기 스크립트가 작동하지 않나요? 그게 되어야 하는 걸까요?
나는 또한 내가 하려는 일을 더 나은/더 효율적인/더 우아한 방식으로 수행하는 방법에 대한 어떤 제안에도 열려 있습니다.
(나는 tr을 사용하지 않았습니다. 유니코드에서는 작동하지 않는 것 같기 때문입니다. 적어도 나에게는 전혀 작동하지 않는다고 합니다.)
답변1
이 !!
바로가기는 대화형 세션에서만 작동합니다. 다른 모든 경우에는 한 쌍의 리터럴 문자로 처리됩니다.
어떻게 되는지 보려면 이것을 복사하여 붙여넣으세요.
cat >/tmp/pling.sh <<x
#!/bin/bash
echo hello, world
echo you said !!
x
# Now make the file executable
chmod a+x /tmp/pling.sh
# Now run it
/tmp/pling.sh
답변2
명령 기록은 스크립트에서 활성화되지 않습니다. 활성화된 경우에도 스크립트는 이를 호출한 대화형 셸의 기록에 액세스할 수 없습니다.
스크립트를 작성하는 대신 ti를 함수로 만들어 .bashrc
.
eval
또한 별도의 bash 인스턴스에서 명령을 실행하는 대신 내장 명령을 사용하여 동일한 컨텍스트(특히 동일한 쉘 변수)에서 실행해야 합니다 .
기록 확장 방법은 간단한 명령에서만 작동합니다. 특수 문자가 포함된 명령은 구문 오류나 기타 예상치 못한 동작을 발생시킵니다. 내장된 함수를 사용하여 fc
프로그래밍 방식으로 기록에 액세스합니다 .
reexecute () {
eval "$(fc -l -1 | sed …)"
}