Por que meu script de shell é interrompido sem a extensão .sh?

6

Eu criei um script de shell /usr/local/bin/suspend com o seguinte conteúdo:

#! /bin/sh

# Take an optional delay parameter
if [ "$#" -gt "0" ]; then
  sleep ""
fi

# Put the system to sleep
dbus-send --system --print-reply --dest="org.freedesktop.Hal" \
    /org/freedesktop/Hal/devices/computer \
    org.freedesktop.Hal.Device.SystemPowerManagement.Suspend \
    int32:0

Se eu chmod +x e executar o script invocando-o diretamente (por exemplo, apenas digitando suspend ou /usr/local/bin/suspend na linha de comando), nada acontece e o shell trava - ele nem responde a Ctrl- C; Eu tenho que mudar para um novo shell e matar o processo bash (que não tem filhos aparentes).

O script funciona bem se eu invocá-lo de uma das seguintes maneiras:

  • Usando sh /usr/local/bin/suspend .
  • Usando . /usr/local/bin/suspend .
  • Renomeá-lo para suspend.sh e invocação de /usr/local/bin/suspend.sh (ou apenas suspend.sh , pois está no PATH ).

A última opção é boa, mas ainda me pergunto: o que exatamente está errado em não usar a extensão .sh ?

    
por Chris Conway 13.12.2010 / 04:19

3 respostas

10

suspend é um bash embutido,

suspend: suspend [-f]
Suspend shell execution.

Suspend the execution of this shell until it receives a SIGCONT signal.
Unless forced, login shells cannot be suspended.

Options:
  -f    force the suspend, even if the shell is a login shell

Exit Status:
Returns success unless job control is not enabled or an error occurs.

e como builtins têm precedência, apenas digitar suspend se comportaria exatamente como você descreve: os blocos de shell até que você o mate (se você kill -CONT , ele recomeça).

O fato de você ver esse mesmo comportamento invocando-o com o caminho é um erro experimental ou um bug no shell. Eu suspeito que o primeiro antes do último.

    
por Chipaca 13.12.2010 / 04:34
1

Se você quiser que seu comando supere um builtin, primeiro você precisa desativar o builtion:

enable -n suspend

Você pode então executar seu comando como um comando normal. Então, você reativa o builtin

enable suspend

Estou surpreso que o builtin seja invocado quando você chama seu comando com o caminho completo.

    
por glenn jackman 04.05.2011 / 15:26
0

Para responder sua pergunta sobre a extensão sh; na verdade é o contrário, você não deveria usá-lo.

  

Não use extensões para seus scripts. Os scripts definem novos comandos que você pode executar e os comandos geralmente não recebem extensões. Além disso: o script bash não é script sh (portanto, não use .sh) e a extensão só causará dores de cabeça de dependências se o script for reescrito em outro idioma.

De #bash na Freenode.net

    
por Cas 04.05.2011 / 02:08

Tags