Jak uzyskać tylko numer wersji php?


15

Chcę uzyskać tylko wersję php zainstalowaną na CentOS.

Wyjście z php -v

PHP 7.1.16 (cli) (built: Mar 28 2018 13:19:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Próbowałem tego:

php -v | grep PHP | awk '{print $2}'

Ale otrzymałem wynik:

7.1.16
(c)

Jak mogę uzyskać tylko 7.1.16?


7
... | head -1lub mogą istnieć lepsze sposoby
LinuxSecurityFreak

Och, głowa -1 jest bardzo prosta i elegancka. Dzięki.
The

Odpowiedzi:


13

W moim systemie:

$> php -v | grep ^PHP | cut -d' ' -f2
7.0.32-0ubuntu0.16.04.1

ponieważ grep PHPpasuje do każdego napotkanego ciągu PHP.

Te ^PHPśrodki „pasuje tylko ciąg«PHP», kiedy to na początku wiersza”.

Oczywiście działa to, jeśli format wyjściowy php -vjest spójny we wszystkich wersjach / kompilacjach.

Dla porównania, cała produkcja to:

PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

Ta odpowiedź była świetna w tym sensie, że mogę ją wykorzystać do grepowania również wersji httpd: P httpd -v | awk '/ ^ Wersja serwera / {print $ 3}' | cut -d '/' -f2
The One

143

Rozszerzając odpowiedź Jeffa Schallera , całkowicie pomiń rurociąg i poproś o wewnętrzną stałą reprezentację:

$ php -r 'echo PHP_VERSION;'
7.1.15

Możesz rozszerzyć ten wzorzec, aby uzyskać więcej lub mniej informacji:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Zobacz listę predefiniowanych stałych PHP dla wszystkich dostępnych.

Główna zaleta: nie opiera się na zdefiniowanym formacie wyjściowym php -v. Biorąc pod uwagę, że jego wydajność jest taka sama jak w przypadku rozwiązania rurociągowego, wydaje się, że jest to bardziej solidny wybór.


Jeśli Twoim celem jest przetestowanie wersji, możesz również użyć tego wzorca. Na przykład ten kod zakończy działanie, 0jeśli PHP> = 7, a 1poza tym:

php -r 'exit((int)version_compare(PHP_VERSION, "7.0.0", "<"));'

Dla porównania, tutaj są czasy dla różnych przypadków testowych, najpierw uporządkowane najszybciej:

$ time for (( i=0; i<1000; i++ )); do php -v | awk '/^PHP [0-9]/ { print $2; }' >/dev/null; done

real    0m13.368s
user    0m8.064s
sys     0m4.036s

$ time for (( i=0; i<1000; i++ )); do php -r 'echo PHP_VERSION;' >/dev/null; done

real    0m13.624s
user    0m8.408s
sys     0m3.836s

$ time for (( i=0; i<1000; i++ )); do php -v | head -1 | cut -f2 -d' ' >/dev/null; done

real    0m13.942s
user    0m8.180s
sys     0m4.160s

26
To naprawdę jedyna poprawna odpowiedź. Nie ma gwarancji, że różne wersje PHP będą miały ten sam format wyjściowyphp -v
puszysty

To było właściwie pierwsze rozwiązanie, które przyszło mi do głowy. Próbowanie parsowania danych wyjściowych jest szybsze, ale prawdopodobnie nie jest tak niezawodne, jak skompilowanie kodu i uruchomienie go.
Ismael Miguel

@ IsmaelMiguel Przypuszczałem, że jest odwrotnie: kompilacja i wykonywanie będą szybsze niż rozwidlenie potoku. Jednak z eksperymentów czasowych stwierdziłem, że nie ma statystycznej różnicy w czasie działania dla obu rozwiązań.
biskup

1
Cóż, masz narzut związany z robieniem PHP> opcode, opcode> C i C na języku maszynowym. Ten narzut jest zawsze stały. PHP może mieć włączoną opcache, co znacznie skraca ten czas. Z drugiej strony musisz spawnować procesy i przekazywać dane wyjściowe do danych wejściowych i innych. Spodziewałbym się, że php będzie działał wolniej po kilkukrotnym uruchomieniu (5-10), w porównaniu do analizowania wyniku. ale dziękuję za testy.
Ismael Miguel

21

Jeśli zainstalowałeś php za pomocą menedżera pakietów (np. RPM lub yum), możesz stamtąd wysłać zapytanie do wersji:

rpm -q --queryformat="%{VERSION}" php

Alternatywnie możesz poprosić php o podanie jego wersji bezpośrednio :

php -r 'echo phpversion();'

6

Są różne sposoby, lubię patrzeć za siebie:

php -v | grep -Po '(?<=^PHP )[^ ]+'

lub

php -v | grep -Po '(?<=PHP )([0-9.]+)'

drobna wskazówka: \ jest niepotrzebne w drugim wyrażeniu regularnym; .normalne znaczenie byłoby bezużyteczne w klasie znaków, więc domyślnie jest już traktowane jako dosłowne
371366

wow, to był ból. czy jest jakiś sposób na umieszczenie pojedynczego odwrotnego ukośnika w tagach `? podwojenie ukośnika nie działało
użytkownik371366

@ dn3s cytuje wzór, działa dla mnie z pojedynczym odwrotnym ukośnikiem ...
Ravexina

och,
miałem na

Umieszczenie komentarza podczas głosowania w dół byłoby właściwe ...
Ravexina

5

Odkąd zacząłeś awk, oto awkrozwiązanie:

$ php -v | awk '/^PHP/{print $2}'
7.2.10

2
php -v | awk NR==1'{print $2}'

Lub

php -v | awk '{print $2; exit}'

1
Możesz także wydrukować tylko pierwszy wiersz, mówiącawk '{print $2; exit}'
fedorqui

0

Jeśli chcesz to zrobić za pomocą tylko jednej funkcji, możesz spróbować użyć sed w następujący sposób:

php -v | sed -e '/^PHP/!d' -e 's/.* \([0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/'

Najpierw usuwa każdą linię, która się nie zaczyna PHP, a następnie wycina wersję z tej linii, zakładając, że jest to pierwsza sekwencja w postaci x.y.z.

Lub, jeśli chcesz mieć coś bliższego oryginalnemu skryptowi, po prostu umieść ^przed wzorem grep, aby szukać tylko linii rozpoczynających się od PHP:

php -v | grep ^PHP | awk '{print $2}'

Podoba mi się sposób, w jaki działało, dodając ^ przed wzorem grep. Znakomity.
The One

0

Myślę, że jest to bardziej czyste i eleganckie rozwiązanie (powinno również działać w systemie Windows):

php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION.'.'.PHP_RELEASE_VERSION;"

Wyjście byłoby jak 7.2.24.


Wydaje się, że jest to w dużej mierze oparte na unix.stackexchange.com/a/471594/117549 , i być może lepiej jest edytować inną odpowiedź, zawierając jedyną nową część:.PHP_MINOR_VERSION
Jeff Schaller
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.