프로그래밍 방식으로 gnome 터미널을 열고 bashrc가 실행 된 후 명령을 실행하십시오.


35

개발 환경을 시작하기 위해 작은 스크립트를 작성했습니다. 한 부분은 자동으로 일부 명령을 실행해야하는 여러 개의 탭이있는 그놈 터미널을 여는 것입니다. 이러한 명령 중 일부는 이미 실행 된 .bashrc에 따라 다릅니다. 그러나 사용할 때

gnome-terminal --tab -e "명령"--tab --tab

.bashrc가 실행되기 전에 명령이 실행됩니다. 자동화 된 gnome-terminal -e를 수동으로 사용되는 것처럼 작동시킬 가능성이 있습니까? ( "cd / foo / bar"와 같은 명령도 gnome-terminal -e에서 작동하지 않습니다)

답변:


45

gnome-terminal이 bash를 시작하면 명령 실행과 관련하여 루프에서 벗어납니다. 입력 및 출력 만 관리합니다. 따라서 ~/.bashrc로드 된 후에 무언가를 실행하려면 bash의 협력이 필요합니다 .

첫째, 많은 경우 실제로 실제로 이후에 명령을 실행할 필요가 없습니다 ~/.bashrc. 예를 들어, 특정 디렉토리에서 터미널을 여는 것은 간단히 수행 할 수 있습니다 cd /foo/bar && gnome-terminal. 비슷한 방식으로 환경 변수를 설정할 수 있습니다 VAR=value gnome-terminal. ( ~/.bashrc환경 변수를 재정의하는 경우 환경 변수가 잘못 정의되어 있습니다~/.profile . 환경 변수 정의가에 속함 )

터미널에서 명령을 실행하지만 이전 ~/.bashrc에는 수행 할 수 있습니다.

gnome-terminal -x sh -c 'command1; command2; exec bash'

여러 개의 탭을 사용하려면 -e대신 을 사용해야 합니다 -x. 그놈 터미널 -e은 쉘을 통해 실행하지 않고 공백에서 인수를 무의식적으로 나눕니다 . 그럼에도 불구하고 공백을 포함하지 않으면 쉘 명령을 작성할 수 있습니다. (대체하지만 그놈 터미널 2.26로 적어도, 당신은, 탭을 사용할 수 있습니다 <TAB>리터럴 탭 문자) :

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

당신이 후 명령을 실행해야 할 경우 ~/.bashrc, 확인 명령을 실행합니다. 예를 들어, 끝에 다음 코드를 포함 시키십시오 ~/.bashrc.

eval "$BASH_POST_RC"

그런 다음 bashrc 다음에 (실제로 끝 부분에) 코드를 실행하십시오.

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

또는 (인용에 덜 무거운)

BASH_POST_RC='command1; command2' gnome-terminal

비록 이런 식으로 그렇게하지 않는 것이 좋지만 , 명령 행에 이미 입력 된 특정 텍스트로 터미널을 시작하는 방법에 언급 된 기술에 관심이 있으 십니까? .


그렇습니다, 정말 좋은 트릭입니다. 그런 생각은하지 않았다. 이제 특정 탭에 대해 BASH_POST_RC 변수를 다르게 설정하는 방법을 찾아야합니다. 그리고 그것은 여전히 ​​문제인 것 같습니다. 간단한 "gnome-terminal --tab -e 'BASH_POST_RC = ls'--tab"은 불가능합니다 :-(
Zardoz

@Zardoz : 실제로 탭 문자를 사용하여 그놈 터미널을 속일 수 있습니다 (수정 된 답변 참조). 인용의 여러 수준을 염두에 두십시오.
Gilles 'SO- 악마 그만해

.. 그것은 작동합니다 :-) ... 솔루션과 인내심에 감사드립니다. 여기 내 완전한 명령 (명령의 해당 공간에서도 작동합니다. gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app"--tab -e 'bash -c "export BASH_POST_RC = \"rails server \ "; exec bash" '--tab -e'bash -c "export BASH_POST_RC = \"autotest \ "; exec bash" '--tab
Zardoz

마침내 작동했습니다 ... soo 후 많은 따옴표로 모든 테스트를 끝냈습니다. 여기 zsh을를 사용에서 서버와 콘솔을 열고, 내되면 :gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
아우구스틴 Riedinger

1
@terdon 아니오, gnome-terminal -e쉘을 전혀 호출하지 않습니다. 를 실행 하면 인수와 함께 gnome-terminal -e 'sleep 9'명령이 실행되고 쉘이 포함되지 않습니다. 실행 하면 터미널이 유효한 시간 간격이 아니라고 불평 하므로 터미널이 즉시 열리고 닫힙니다 . 당신과 무슨 일이 일어나고 있는지 관찰 할 수sleep9gnome-terminal -e 'sleep 9;bash'sleep9;bashstrace -f -eexecve gnome-terminal -e …
질 'SO-정지되는 악'

6

당신이 사용하는 경우 -e옵션을 gnome-terminal(당신도 뭔가를 실행할 수있는 새로운 쉘을 시작하지 않고 해당 명령을 실행 gnome-terminal -e gedit하면로 명령을 실행하려는 그렇다면) bash당신이 뭔가를해야 할 새로운 터미널 / 탭에 쉘 :

gnome-terminal -x bash -c "command"

그러나 "command"종료되면 터미널 / 탭도 종료됩니다.


1
나는 당신이 의미한다고 생각합니다 gnome-terminal -x bash -c "command"( -e단일 주장을 기대합니다). command최소한 하나의 탭을 시작하는 한 셸을 실행하는 것은 매우 간단합니다 . 내 답변을 참조하십시오 .
Gilles 'SO- 악마 중지

gnome-terminal -x "bash" -c "command"나를 위해 일했다. -x arg 값에 따옴표를 사용하십시오.
erm3nda

내가 얻을 # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
이후, 우리는 무엇을해야 마십시오 -x-eoptons이되지 않습니다 ???
nyxee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.