O shell script não executa o comando cd

15

Eu tenho um jogo baseado em texto, Colossal Cave Adventure, que gostaria de iniciar com um shell script em vez de abrir o terminal e digitar cd ~/Desktop/CCAe ./Adventure. O código que estou tentando usar é o seguinte:

#! /bin/bash
gnome-terminal -e 'cd ~/Desktop/CCA/; ./Adventure'

e a mensagem que recebo é esta:

There was an error creating the child process for this terminal
Failed to execute child process `cd` (No such file or directory)

com opções para alterar as preferências do perfil ou reiniciar o processo. Também tentei usar o caminho absoluto em vez de ~/, e todos os meus nomes de arquivo estão escritos corretamente e apontam para o lugar certo. O que está errado?

Giaphage47
fonte

Respostas:

16

cd é um shell embutido. você deve usar isto:

#! /bin/bash
gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'
Taher Khorshidi
fonte
Obrigado, eu não sabia que isso cdnão era um comando.
Giaphage47
1
cdcertamente é um comando! É o que é conhecido como comando interno do shell , como a resposta de Hastur afirma corretamente. Os comandos internos do shell geralmente são chamados de "shell internos" ou "internos", mas são absolutamente comandos. O que cdnão é é um comando externo . O Ubuntu não tem cd programa (e, se o fizesse, executá-lo ainda não teria o efeito de alterar o diretório no shell a partir do qual você o executou ). @ Giaphage47
Eliah Kagan
11

O erro

Failed to execute child process "cd" (No such file or directory)

surge porque cdé um dos SHELL BUILTIN COMMANDSe não um executável que você encontra fisicamente no seu disco rígido.

Para executá-lo ou os outros built-incomandos em seu script, você precisa passar toda a linha para uma bashchamada

 gnome-terminal -e '/bin/bash -c "cd ~/Desktop/CCA/; ./Adventure" '   

Se não houver outro comando interno que você precise executar, você poderá definir o diretório de trabalho para o gnome terminal, conforme a resposta aqui :

gnome-terminal --working-directory=/home/username/Desktop/CCA/ -e './Adventure'

Anúncio nauseam : existem algumas alternativas:

Se você está apenas em um terminal, você pode fazer

  • um aliaslike
    alias Star_My_Game="cd ~/Desktop/CCA; ./Adventure "
    e coloque-o em seu .bashrcou em ~/.bash_aliasespara que você possa executar com o único comando Start_My_Gameem cada shell que você for (é mais confortável escolher um nome mais simples / abreviado que Start_My_Game ...)

  • ou um script que você pode tornar executável ( chmod u+x MYscript) e colocar no seu path(tipicamente ~/biné um bom candidato).

Suponho que você possa colocar um link na área de trabalho que execute o terminal e modifique o comportamento inicial. Da ajuda do gnome

  1. Selecione Editar Prefer Preferências do perfil ▸ Título e comando.

  2. Marque Executar um comando personalizado em vez do meu shell.

  3. Na caixa de texto, digite o comando ou o shell desejado.

  4. O comando será passado para o terminal exatamente como você o escreve, incluindo quaisquer argumentos que você especificar. As variáveis ​​de ambiente serão herdadas do terminal, pois é um processo filho do terminal.

    Abra uma nova guia ou janela do Terminal para ver como o shell ou comando personalizado é executado

Hastur
fonte
Mas o objetivo era iniciar a partir de um script de shell e não ter que abrir uma janela do terminal.
Giaphage47
Se você deseja iniciar a partir de um script é uma suficiente alias(mais aconchegante) ou um script em seu diretório ~ / bin, sem lançar um novo terminal
Hastur
Resposta atualizada apenas no caso de você precisar novamente: é possível passar, cdmas você precisa bash. Dê um cheque :) -
Hastur 28/05