[bash] Read builtin werkt niet in combinatie met xargs

Pagina: 1
Acties:

  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Topicstarter
Ik ben een aantal bash scripts aan het maken voor het automatiseren van simpele taken. Dit lukt op zich aardig, alleen ben ik iets wazigs tegengekomen.
Als ik via xargs mijn script aanroep, werkt het read builtin command niet. Er komt niet eens een prompt! :( Als ik handmatig mijn script start (met dezelfde argumenten als xargs geeft) dan werkt read wel.
code:
1
2
3
#!/bin/sh
read -p Beschrijving:\ INPUT
echo $INPUT

Dit geeft wanneer rechtstreeks uitgevoerd een 'Beschrijving: ' prompt, waar ik ook een tekst kan invoeren. Als ik echter dit uitvoer:
code:
1
find /pad/naar/files | sed s-/pad/naar/files/-- | sort | xargs -n 1 ./script.sh
komt er geen prompt, en kan ik ook niets invoeren.
edit:
script.sh wordt wel uitgevoerd. ;)


Waardoor komt dit, en is dit op te lossen? :)

[ Voor 5% gewijzigd door Zr40 op 02-05-2004 13:19 . Reden: Verduidelijking ]


Verwijderd

Zr40 schreef op 02 mei 2004 @ 13:15:
Ik ben een aantal bash scripts aan het maken voor het automatiseren van simpele taken. Dit lukt op zich aardig, alleen ben ik iets wazigs tegengekomen.
Als ik via xargs mijn script aanroep, werkt het read builtin command niet. Er komt niet eens een prompt!
Dat klopt, het read commando leest van standard input, aleen als die input van een tty komt laat hij de prompt zien.
code:
1
2
3
#!/bin/sh
read -p Beschrijving:\ INPUT
echo $INPUT
Weet je zeker dat read op die manier werkt? probeer dit eens:
Bash:
2
read -p 'Beschrijving: ' INPUT
Dit geeft wanneer rechtstreeks uitgevoerd een 'Beschrijving: ' prompt, waar ik ook een tekst kan invoeren. Als ik echter dit uitvoer:
code:
1
find /pad/naar/files | sed s-/pad/naar/files/-- | sort | xargs -n 1 ./script.sh
komt er geen prompt, en kan ik ook niets invoeren.
edit:
script.sh wordt wel uitgevoerd. ;)


Waardoor komt dit, en is dit op te lossen? :)
Het probleem is dat je rare dingen doet :) xargs leest van standard input en en geeft de input door als argumenten aan het script. Dit betekent in jouw geval dat als er in een directory b.v. de files a.txt en b.txt staan, het script 2x wordt aangeroepen (door de -n 1) en wel als "script.sh a.txt" en "script.sh b.txt". Dit is hoogstwaarschijnlijk niet wat je verwacht, want je doet niets met het $1 argument in script.sh

  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Topicstarter
Verwijderd schreef op 02 mei 2004 @ 13:43:
Dat klopt, het read commando leest van standard input, aleen als die input van een tty komt laat hij de prompt zien.
Het is de bedoeling dat read van de tty leest :)
Weet je zeker dat read op die manier werkt? probeer dit eens:
Bash:
2
read -p 'Beschrijving: ' INPUT
Ik was een spatie vergeten in mijn bericht. :+ In mijn script had ik wel een extra spatie achter de geescapede. De prompt quoten ipv escapen maakt niets uit. :|
Het probleem is dat je rare dingen doet :) xargs leest van standard input en en geeft de input door als argumenten aan het script. Dit betekent in jouw geval dat als er in een directory b.v. de files a.txt en b.txt staan, het script 2x wordt aangeroepen (door de -n 1) en wel als "script.sh a.txt" en "script.sh b.txt". Dit is hoogstwaarschijnlijk niet wat je verwacht, want je doet niets met het $1 argument in script.sh
Dit is de bedoeling, ik had dat deel weggelaten voor de duidelijkheid :)

Verwijderd

Zr40 schreef op 02 mei 2004 @ 13:59:
Het is de bedoeling dat read van de tty leest :)
Maar dat kan dus nooit als het script in een pipe zit, je standard input is immers geen tty meer (en xargs brengt de tty niet op magische wijze terug aan het eind van de pipe).

Je zult je find pipe dus in je script moeten uitvoeren, en in je script met de output werken:

code:
1
2
3
4
5
#!/bin/bash
for FILE in `find /pad/naar/files | sed s-/pad/naar/files/-- | sort` ; do
    read -p "$FILE Beschrijving: " DESCR
    echo $FILE $DESCR
done


edit:
Als je de find pipe niet in het script wilt kun je het zo oplossen:
code:
1
2
3
4
5
#!/bin/bash
for FILE ; do
    read -p "$FILE Beschrijving: " DESCR
    echo $FILE $DESCR
done

en dan zo aanroepen:
code:
1
./script.sh `find /pad/naar/files | sed s-/pad/naar/files/-- | sort`

[ Voor 21% gewijzigd door Verwijderd op 02-05-2004 15:36 ]


  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Topicstarter
Ik heb het nu op deze manier opgelost:
code:
1
2
3
4
#!/bin/bash
for FILE in `find /pad/naar/files | sed s-/pad/naar/files/-- | sort` ; do
    ./script.sh $FILE
done

Dit werkt perfect, bedankt :)