터미널없이 실행 파일로 실행할 때 bash 스크립트에서 사용자 입력을받는 방법? 입력에 따라 일부

나는 입력에 따라 일부 사용자 입력과 프로세스를 필요로하는 bash 스크립트를 만들려고 노력하고있다.

이 스크립트는 실행 가능하며 스크립트가 있습니다.

스크립트는 다소 다음과 같습니다.

#!/bin/bash
read name -p "Enter your name"
echo $name >> namelist.txt

나는 사용자가 터미널에서 스크립트를 열지 않기를 바란다. 스크립트는 실행 가능하게 만들어지고 (chmod + x) 스크립트를 두 번 클릭하면 실행됩니다. 그러나 입력을 일시 중지하지 않으며 파일은 비어 있습니다.



답변

사용자 입력을 위해 GUI 또는 터미널이 있어야합니다. 사용자가 Nautilus에서 스크립트를 열면 stdin이 없으므로 read가 즉시 반환됩니다. 한 가지 가능한 해결책은 스크립트를 새 터미널을 열고 다음과 같이 자체에서 실행하는 것입니다.

x-terminal-emulator -e $0

x 터미널 에뮬레이터에서는 기본 터미널 에뮬레이터가 호출됩니다. 데비안 & amp; 우분투, 나는 다른 배포판에 대해 모른다.
물론 xterm, konsole 또는 다른 터미널과 같은 특정 터미널을 호출 할 수 있습니다.

$0 는 스크립트의 파일 경로이므로 항상 작동합니다.

또한 터미널을 재귀 적으로 열지 않아야합니다. 이것이 작동 할 수있는 한 가지 방법은 이미 어쨌든 당신이 stdin에서 읽을 수 있는지 확인하는 것입니다.

파일 끝 (end-of-file)이 없으면 읽기 명령의 리턴 코드는 0입니다.
  문자가 읽히거나, 읽는 시간이 초과되거나 유효하지 않은 파일
  descriptor가 인수로 -u 옵션에 제공됩니다.

따라서 반환 값을 확인하십시오! = 0이면 위와 같은 새 터미널을 열고 그렇지 않으면 그렇지 않습니다.

예:

#!/bin/bash

read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
        x-terminal-emulator -e $0
else
        echo $first
        read -p "Enter more: " more
        echo $more
fi

만나다 이 질문 프로그램이 끝난 후에도 터미널을 열어 두어야 할 경우.


답변

무작위 적중과 시련은 나를 해결책으로 이끌었다.

Nautilus에서 실행 파일을 두 번 클릭하면 기본 텍스트 편집기에서 스크립트를 “실행”하거나 (콘솔없이) “터미널에서 실행”또는 “열기”를 묻는 팝업이 열립니다.

“터미널에서 실행이 목적을 달성 할 것입니다”를 선택하십시오.