배쉬에서 탈출

배쉬에서 탈출

문자 메시지가 나타나면 프로그래밍 방식으로 bash 명령을 생성하여 터미널 에뮬레이터를 열고 이 텍스트를 표시해야 합니다.
예를 들어 HelloWorld입력 문자열의 경우 다음 출력 문자열을 반환해야 합니다.
gnome-terminal -e "$SHELL -c echo\ HelloWorld;exec\ $SHELL"

문제는 입력 메시지에 임의의 기호가 포함될 수 있다는 것입니다.
시행착오를 통해 저는 서로 다른 기호를 서로 다른 시간에 이스케이프해야 한다는 것을 결정했습니다.

"A" must be converted to "A"        (0 times to be escaped)
" " must be converted to "\ "       (1 times to be escaped)
"(" must be converted to "\\\("     (2 times to be escaped)
"\" must be converted to "\\\\\\\\" (3 times to be escaped)

예를 들어 \(o o)/다음과 같이 명령에 삽입해야 합니다 \\\\\\\\\\\(o\ o\\\)\\\/. gnome-terminal -e "$SHELL -c echo\ \\\\\\\\\\\(o\ o\\\)\\\/;exec\ $SHELL"

사실 저는 bash를 전혀 모르기 때문에 그 논리를 완전히 이해하지 못합니다.
일반 규칙, 즉 ASCII 하위 집합(10,32-126)의 기호를 변환하는 방법을 알려주실 수 있나요?

편집하다:
내가 하고 있는 일에 대한 더 명확한 아이디어를 제공합니다.

문자열 InputText를 받고 다른 문자열, 즉 올바른 bash 명령을 반환하는 함수(일부 프로그래밍 언어)를 작성하려고 합니다.
현재 저는 이 함수를 다음의 간단한 연결로 구현하려고 합니다.
1) 상수 접두사 gnome-terminal -e "$SHELL -c echo
2) InputText에 의존하는 내부 부분
3) 상수 접미사 ;exec\ $SHELL"
문제는 내부 부분에 있습니다. 변환 후 각 InputText 기호를 연결하여 계산하려고 합니다. 하지만 임의의 기호를 변환하는 방법을 모르겠습니다.

편집 2:
대량 이스케이프를 피하기 위해 작은따옴표를 사용하는 아이디어를 주신 choroba에게 감사드립니다.
나는 bash에 대해 많은 것을 배웠습니다. ))

이것은 choroba의 답변의 수정된 버전입니다.
동일한 아이디어이지만 "백슬래시-백슬래시 연결"이 없으며 Lua에서 구현되었습니다.

function run_terminal(text)
   local function q(s) return "'"..s:gsub("'","'\\''").."'" end
   os.execute(
      'gnome-terminal -e "$SHELL -c "'..q(q("echo "..q(text)..";exec $SHELL"))
   )
end
run_terminal "Some Text"

편집 3:
gnome-terminal의 "-x COMMAND" 옵션을 언급한 Gilles에게 감사드립니다. 이 옵션에는 인용이 필요하지 않으므로 빌드 명령에서 인용 수준을 줄일 수 있습니다.

function run_terminal(text)
   local function q(s) return "'"..s:gsub("'","'\\''").."'" end
   os.execute("gnome-terminal -x sh -c "..q("echo "..q(text)..";exec $SHELL"))
end
run_terminal "Some Text"

답변1

문자열을 인용하려면 백슬래시를 사용하여 인용하면 됩니다. 두 번 인용하는 경우 두 참조 유형을 모두 이스케이프해야 합니다.

고쳐 쓰다:Gnome 터미널에는 삼중 따옴표가 필요합니다. 문자열에서 작은따옴표를 두 번 이스케이프하고 삽입된 문자열 주위에 작은따옴표를 사용하십시오. 또한 원래 문자열의 백슬래시를 백슬래시해야 합니다.

증명: 나는 다음 Perl 스크립트를 사용했습니다:

#!/usr/bin/perl
use strict;
use warnings;
use feature qw{ say };

chomp( my $msg = <> );
$msg =~ s/\\/\\\\/g;           # Quis backslashies backslashes tandem?
$msg =~ s/'/'\\''/g for 1, 2;  # Replace ' by '\'' twice.
$msg =~ s/"/\\"/g;             # Backslash double quotes.
system q(gnome-terminal -e 'bash -c "echo '\\'') . $msg . q('\\''; exec bash"');

답변2

인용하는 것을 잊어버리고 텍스트를 환경 변수에 넣으십시오.

-x쉘을 시작하는 데 사용됩니다 .

이에 대한 코드를 작성하지 마십시오 $SHELL. 어떤 구문을 이해하는지 알 수 없습니다. 코드를 실행 sh하고 $SHELL대화형 셸을 호출하기 위해 호출됩니다.

message='HelloWorld' gnome-terminal -x sh -c 'printf %s\\n "$message"; unset message; exec "$SHELL"'

관련 정보