plik istnieje nie działa w oczekiwanym skrypcie


1

Próbuję sprawdzić, czy określony wiersz w nazwie pliku znajduje się na hoście. Zatem tylko jeśli określony wzór zostanie znaleziony w poleceniu grep, zostanie utworzony plik dummy.txt. Następnie chcę sprawdzić, czy plik dummy.txt istnieje jako warunek, i kontynuować.

Ale mimo że tworzony jest plik dummy.txt, nie można go znaleźć w instrukcji if:

if {[file exists $fileName] }

i kontrola jest przenoszona do bloku else. Co może być przyczyną? Czy jest jakiś łatwiejszy sposób na osiągnięcie tego, co próbuję?

 set Host [lindex $argv 0 ]
 spawn ssh -o StrictHostKeyChecking=no userid@$Host
 expect "*assword*"
 send "password\n"
 expect "+"
 send "cd path/that/contains/filename\n"
 expect "*$*"
 send "pwd\n"
 set fileName dummy.txt
 send {grep '\[abc\]' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
 send "\n"
 expect "+"
 send {grep 'xyz' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
 send "\n"
 expect "+"
 send "chmod 777 dummy.txt\n"
 if {[file exists $fileName] } {

   send {printf "\nabc xyz already exists"} 
   send "\n"
   expect "+"
   send "ls -l\n"
   expect "+"
   send "rm dummy.txt\n"
   expect "+"
   send "ls -l\n"
   expect "+"
        send "exit\n"
  } else {
        send {printf "cannot find $fileName"}
   send "\n"
   expect "+"
   send {printf "\n[abc]\nxyz\n" >> filename}
   send "\n"
   expect "+"
   send "cat filename\n"
   expect "+"
    send "exit\n"

    }

Zamiast tego wc | read ...możesz po prostu sprawdzić kod powrotu grep (0 = znaleziono dopasowanie, zobacz man grep).
ott--

Odpowiedzi:


1

if {[file exists $fileName] }sprawdzi, czy plik istnieje w systemie lokalnym (tym, w którym expectdziała), ale warunkowo utworzony plik będzie na zdalnym hoście (tym, do którego loguje się skrypt ssh), jeśli istnieje. Również filenameto dummy, ale warunkowo tworzony jest plik dummy.txt.


Przepraszam Scott, to była literówka. Jego dummy.txt jest wszędzie. Jeśli sprawdza na zdalnym komputerze, jak mogę go sprawdzić na hoście? Próbuję zautomatyzować proces dodawania określonych linii do pliku, ale jednocześnie, jeśli te linie już istnieją, nie chcę duplikatów wpisów, dlatego używam grep i dummy.txt
user417721

Dziękujemy za naprawienie literówki w pytaniu. Ale dopóki edytujesz pytanie, powinieneś je wyjaśnić. Nie do końca rozumiem twój komentarz. Jeśli chcesz zrobić coś warunkowo na zdalnym hoście w oparciu o warunki na hoście zdalnym, pomyśl o tym jak o skrypcie powłoki i użyj logiki powłoki; np send {grep -q xyz filename || echo xyz >> filename}.
Scott,

Muszę dodać trochę treści, powiedzmy, xyz abc do nazwy pliku na zdalnym hoście. Ale chcę sprawdzić, czy te xyz abc już istnieje w nazwie pliku. aby to sprawdzić używam send {grep '[abc]' filename | wc -l | { Czytaj linię; ["$ line"! = "0"] && echo "$ line"> dummy.txt; }} wyślij „\ n” oczekuj „+” wyślij {grep 'xyz' nazwa pliku | wc -l | { Czytaj linię; ["$ line"! = "0"] && echo "$ line"> dummy.txt; }} wyślij "\ n" Więc jeśli xyz abc istnieje w nazwie pliku, tworzony jest nowy plik dummy.txt. Jeśli więc plik dummy.txt istnieje na pilocie, oznacza to, że xyz i abc są obecne w nazwie pliku, a skrypt nie musi ich dodawać ponownie
user417721

Wiem, że wydaje się to trochę za długie, ale nie mogłem wymyślić prostszego sposobu na osiągnięcie tego, ponieważ muszę użyć interakcji. Jeśli możesz zasugerować rozwiązanie, aby sprawdzić plik na zdalnym hoście lub prostszy sposób, aby to wszystko działało, byłoby świetnie :)
user417721

send {[ -f dummy.txt ] && echo "xyz abc" >> filename}. Lub przeczytaj ponownie mój najnowszy komentarz.
Scott,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.