2009-10-15 9 views
-1

je tente la commande suivante sur la ligne de commandedans une commande shell

ps -u `id | cut -f2 -d"=" | cut -f1 -d"("` -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep KLMN | wc -l 

la valeur de Teh commande est renvoyée comme 7.

mais quand je suis en train de la même commande dans un script abc_sh comme ci-dessous

ps -u `id | cut -f2 -d"=" | cut -f1 -d"("` -f | grep ppLSN | awk '{print $9}' | awk '{FS="=";print $2}' | grep $XYZ | wc -l 

et je fais appel le script sur la ligne de commande comme abc_sh XYZ=KLMN et il ne fonctionne pas et retourne 0 le problème est avec le grep dans la commande grep $XYZ pourrait quelqu'un s'il vous plaît dire pourquoi cela ne fonctionne pas? Parce que votre variable $ 1 (premier argument du script) est définie sur XYZ = KLMN.

+0

Pour commencer, au lieu de cette coupe inutile, utilisez id -u. –

+0

Mauvaise question, pourquoi cachez-vous des informations pertinentes? D'abord cela a fonctionné avant (aucune mention de cela), alors vous utilisez ksh, pas bash (l'habituel), et aucune mention de cela non plus. –

+0

Séparer l'argument '-f' si loin vers la droite après l'expansion de la commande le fait perdre dans le fouillis. Mettez-le au début: 'ps -f -u ...' (j'ai utilisé ici des traits d'union séparés uniquement pour "esthétique"). –

Répondre

3

Il suffit d'utiliser abc_sh KLMN et grep $1 au lieu de grep $XYZ.

(En supposant que nous parlons de bash ici)

L'autre alternative consiste à définir une variable d'environnement temporaire auquel cas vous devrez l'appeler comme ceci: XYZ=KLMN abc_sh

EDIT:

trouvé ce que vous utilisez, vous devez utiliser set -k (voir SHELL ORDRES dans le manuel BASH)

  -k  All arguments in the form of assignment statements are 
        placed in the environment for a command, not just those 
        that precede the command name. 

Alors

[email protected]:~$ more abc 
#!/bin/bash 
echo $XYZ 
[email protected]:~$ set -k 
[email protected]:~$ ./abc XYZ=KLMN 
KLMN 
[email protected]:~$ set +k 
[email protected]:~$ ./abc XYZ=KLMN 

[email protected]:~$ 

Ainsi, le lieu où cela fonctionnait a probablement set -k dans l'un des scripts de démarrage

+0

Il y a une contrainte que je ne devrais pas appeler le script comme vous l'avez dit abc_sh KLMN. – Vijay

+0

Vous auriez dû le dire, mais de toute façon, la façon de le faire est déjà deux fois déjà répondu –

+0

ceci est un script déjà existant où il sera appelé comme ça seulement abc_sh XYZ = KLMN et maintenant j'utilise cette variable XYZ.mais c'est ne fonctionne pas.même si je fais echo $ XYZ avant la commande à l'intérieur du script, il ne montre rien. Et cette variable est déjà utilisée dans d'autres endroits du script où elle fonctionne correctement. – Vijay

2

Essayez l'une de ces options pour définir une variable d'environnement temporaire (bashrc ou profil.):

XYZ=KLMN abc_sh 
env XYZ=KLMN abc_sh 
(export XYZ=KLMN; abc_sh) 
+0

Dysoistia :(http://stackoverflow.com/questions/1386824/hired-as-a-developer-to-maintain- et-update-current-code-base-no-docs/1386842 # 1386842 –

1

vous utilisez tant de commandes enchaînées ensemble ....

ps -u `id -u` -f | awk -v x="$XYZ" -v p="ppLSN" '$0~p{ 
m=split($9,a,"=") 
if(a[2]~x){count++} 
} 
END{print count}' 
0

Appelez ce script:

#!/bin/ksh 
ps -u $(id -u) -o args | grep $XYZ | cut -f2- -d " " 

Comme ceci:

XYZ=KLMN abc_sh 
Questions connexes