아무 키나 누를 때마다 bash 상단에 텍스트 에코가 중지되도록 어떻게 알 수 있나요?

아무 키나 누를 때마다 bash 상단에 텍스트 에코가 중지되도록 어떻게 알 수 있나요?

나는 gnome-terminal에 대한 사용자 정의 시작 명령을 작성 중이며, 실행할 때마다 환영 메시지를 표시하려는 의도입니다.

메시지가 올바르게 표시됩니다. 문자가 0.09초의 속도로 하나씩 표시되도록 코딩했습니다.

echo -n "W" 
sleep 0.09
echo -n "e" 
sleep 0.09
echo -n "l"
sleep 0.09
echo -n "c"
sleep 0.09
echo -n "o"
sleep 0.09 
echo -n "m"
sleep 0.09 
echo -n "e" 
sleep 0.09 

테스트하면서 글자가 나오지 않게 하고 su바로 시작할 수 있으면 꽤 편할 것 같다는 생각이 들었습니다. 나는 다음과 같은 해결책을 생각해 냈습니다.

su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"

bash 가 su -c화를 내고 illegal action: read -n. 이 코드 조각은 bash가 한 줄 명령 조합을 어떻게 읽는지 테스트하고 싶었기 때문에 디버깅 목적으로만 사용되었습니다.

주요 문제는 구성 파일(시작을 위한 사용자 정의 명령을 작성하는 파일)에서 이 코드를 실행하려고 할 때 발생합니다. Bash는 다음을 반환합니다.

No passwd entry for user 'Successful.; else echo Test'
Welcome

이상하게도 기본 프로필에서 동일한 명령( 없이)을 시도하면 su -c완벽하게 작동하지만 su -c로 시도하면 그렇지 않습니다.

기본 프로필에서 다른 명령을 사용해 보니 입력 su -c "echo Hi"하고 제대로 작동했습니다. 왜 이런 일이 일어날 수 있습니까? 어떤 생각이 있나요?

답변1

전체 명령을 큰따옴표 대신 작은따옴표로 묶습니다. 가장 먼저 주목해야 할 점은 변수($key)가 있다는 것입니다. 큰따옴표로 묶인 이 값은 에 주어진 인수로 만들기 전에 쉘로 대체됩니다 su. 두 번째는 현재 가지고 있는 것과 일치하는 따옴표에 관한 것입니다. 큰 따옴표를 사용하면 인수가 다음과 같이 분할됩니다.

  • 인수0:su
  • 인수1:--command
  • 인수2:read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
  • 인수3:Successful.; else echo Test
  • 인수4:Failed.; fi;

전체 인수를 작은따옴표로 묶으면 이 문자열을 있는 그대로 의 두 번째 인수로 전달하여 두 가지 문제를 해결하고, 변수 대체를 방지하고, 분할 이상한 문제를 해결할 수 있습니다 su.

보너스: 일반적으로 가능한 경우 테스트에 이중 괄호를 피하십시오. 이는 bashism입니다(bash에서만 작동하고 보다 호환되는 카운터 부분으로 대체될 수 있는 구문).

다음 버전은 예상대로 작동합니다.

su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'

관련 정보