como começar de dentro do meu xterm shell script que inicia o mplayer e reproduz os arquivos que são o argumento do script

3

O que eu quero fazer: iniciar meu script com uma lista de arquivos como argumentos. De dentro do meu script eu quero iniciar o xterm que inicia o mplayer com esses arquivos.

Eu tentei várias coisas. Eu chamo meu script assim:

myscript.sh *

Os arquivos são nomeados como

"aaa AAA"
"bbb BBB"
"ccc DDD"

(ou seja, nomes de arquivos com espaços) e são sons, músicas ou vídeos reproduzíveis com o mplayer.

Isso é o que eu tentei

Todos os comandos seguintes foram escritos dentro do meu script!

Eu tentei:

  1. Os seguintes trabalhos . Os arquivos são impressos.

    ls -l $@
    
  2. Os seguintes trabalhos . Os arquivos são impressos.

    IFS='\n'
    ls -l $*
    
  3. Os seguintes trabalhos . Os arquivos são impressos. Estranhamente não preciso do IFS='\n' aqui. Por quê?

    xterm -e 'ls -l $*; read'
    
  4. Este não encontra os arquivos.

    FILES=$@
    ls -l $FILES
    
  5. Este não encontra os arquivos. Aqui, todos os nomes de arquivos são tratados como um nome de arquivo longo. (???)

    IFS='\n'
    FILES=$@
    ls -l $FILES
    
  6. Este não encontra os arquivos.

    export FILES=$@
    ls -l $FILES
    
  7. Mas o seguinte funciona . Os arquivos são impressos.

    IFS='\n'
    export FILES=$@
    ls -l $FILES
    

Agora com o mplayer.

  1. Este funciona .

    IFS='\n'
    export FILES=$@
    mplayer $FILES
    
  2. Este não funciona. Mas por que então o número 2 para ls -l funciona? Aqui o mplayer sai imprimindo a ajuda como se eu tivesse acabado de iniciar mplayer sem argumentos.

    xterm -e 'mplayer $*; read'
    
  3. Este não funciona. Ele falha para todos os arquivos com espaços no nome do arquivo.

    IFS='\n'
    FILES=$@
    xterm -e 'mplayer $FILES; read'
    

Pergunta: Como posso iniciar o mplayer a partir do seu próprio xterm com os arquivos salvos na variável $FILES ?

    
por erik 11.02.2013 / 14:24

1 resposta

2

Se você quiser passar os argumentos para o seu script para o mplayer, em um xterm, isso deve funcionar:

#!/bin/sh
xterm -e mplayer "$@"

Isso funciona porque "$@" se expande: um parâmetro por item. xterm não tenta interpretar os argumentos para o comando de qualquer forma; apenas passa por eles.

Se você precisa realmente colocar sua lista de arquivos em uma variável, sua melhor aposta é usar uma variável de matriz. Por exemplo:

#!/bin/bash
declare -a FILES
for f; do
    if [ -r "$f" ]; then
        FILES+=("$f")
    fi
done

xterm -e mplayer "${FILES[@]}"

O acima filtra os arquivos para passar apenas aqueles que são legíveis. Este é apenas um exemplo, normalmente você não faria esse tipo de filtragem. Além disso, normalmente, usaria um nome de variável em minúsculas, a menos que estivesse planejando exportá-lo.

PS: Dependendo do que você está fazendo, você está ciente do modo -slave do mplayer?

    
por 11.02.2013 / 15:27