Запуск скрипта bash приводит к ошибке «неверный интерпретатор: нет такого файла или каталога»

MingW32

Make sure that MinGW32’s bin dir is in the search path, for example:

then run in the root dir. There are other make targets available to build libcurl with more features, use:

  • to build with Zlib support;
  • to build with SSL and Zlib enabled;
  • to build with SSH2, SSL, Zlib;
  • to build with SSH2, SSL, Zlib and SSPI support.

If you have any problems linking libraries or finding header files, be sure to verify that the provided files use the proper paths, and adjust as necessary. It is also possible to override these paths with environment variables, for example:

It is also possible to build with other LDAP SDKs than MS LDAP; currently it is possible to build with native Win32 OpenLDAP, or with the Novell CLDAP SDK. If you want to use these you need to set these vars:

or for using the Novell SDK:

If you want to enable LDAPS support then set LDAPS=1.

Как разрешить ошибку «bash: wget: command not found»

Для того, чтобы решить ошибку «bash: wget: command not found», вам необходимо установить утилиту wget на сервере.

В Debian и Ubuntu:

root@ubuntu:~# apt-get install wget

Пример журнала установки:

root@ubuntu:~# apt-get install wget
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  wget
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 298 kB of archives.
After this operation, 901 kB of additional disk space will be used.
Get:1 http://ap-south-1.ec2.archive.ubuntu.com/ubuntu xenial-updates/main amd64                                                                                         
wget amd64 1.17.1-1ubuntu1.2 
Fetched 298 kB in 0s (401 kB/s)
Selecting previously unselected package wget.
(Reading database ... 51222 files and directories currently installed.)
Preparing to unpack .../wget_1.17.1-1ubuntu1.2_amd64.deb ...
Unpacking wget (1.17.1-1ubuntu1.2) ...
Processing triggers for install-info (6.1.0.dfsg.1-5) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up wget (1.17.1-1ubuntu1.2) ...

На RHEL и Centos. 

# yum install wget

Пример журнала установки:

# yum install wget
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Resolving Dependencies
--> Running transaction check
---> Package wget.x86_64 0:1.14-13.el7 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
========================================================================================================================================================================
Package                        Arch                             Version                               Repository                                                  Size
========================================================================================================================================================================
Installing:
wget                           x86_64                           1.14-13.el7                           rhui-REGION-rhel-server-releases                           546 k
 
Transaction Summary
========================================================================================================================================================================
Install  1 Package
 
Total download size: 546 k
Installed size: 2.0 M
Is this ok [y/d/N]: y
Downloading packages:
wget-1.14-13.el7.x86_64.rpm                                                                                                                      | 546 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : wget-1.14-13.el7.x86_64                                                                                                                              1/1
  Verifying  : wget-1.14-13.el7.x86_64                                                                                                                              1/1
 
Installed:
  wget.x86_64 0:1.14-13.el7
 
Complete!
#

Как использовать wget для загрузки файлов через Интернет.

Синтаксис:

wget http://url/file
 
or
 
wget ftp://url/file

Примеры журнала загрузки:

# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
--2017-05-06 11:21:34--  http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
Resolving packages.sw.be (packages.sw.be)... failed: Name or service not known.
wget: unable to resolve host address ‘packages.sw.be’
# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
--2017-05-06 11:21:34--  http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
Resolving dl.fedoraproject.org (dl.fedoraproject.org)... 209.132.181.24, 209.132.181.25, 209.132.181.23
Connecting to dl.fedoraproject.org (dl.fedoraproject.org)|209.132.181.24|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14704 (14K) [application/x-rpm]
Saving to: ‘epel-release-7-9.noarch.rpm’
 
100% 14,704      57.8KB/s   in 0.2s
 
2017-05-06 11:21:34 (57.8 KB/s) - ‘epel-release-7-9.noarch.rpm’ saved [14704/14704]

В приведенном выше примере мы загрузили файл «rpmforge-релиз-0.5.2-2.el6.rf.x86_64.rpm» с адреса URL «packages.sw.be/rpmforge-release/rpmforge-release-0.5.2- 2.el6.rf.x86_64.rpm»с использованием протокола HTTP.

Disabling Specific Protocols in Windows builds

The configure utility, unfortunately, is not available for the Windows
environment, therefore, you cannot use the various disable-protocol options of
the configure utility on this platform.

You can use specific defines to disable specific protocols and features. See
CURL-DISABLE.md for the full list.

If you want to set any of these defines you have the following options:

  • Modify
  • Modify
  • Modify
  • Modify the «Preprocessor Definitions» in the libcurl project

Note: The pre-processor settings can be found using the Visual Studio IDE
under «Project -> Settings -> C/C++ -> General» in VC6 and «Project ->
Properties -> Configuration Properties -> C/C++ -> Preprocessor» in later
versions.

История команд

«Работа с историей команд» – классическая тема обычно из любого начального курса по Linux (по крайней мере, среди тех курсов, которые читаются у нас в «Сетевой Академии ЛАНИТ»). И многие, кто имеет хотя бы небольшой опыт работы с командной строкой, историей команд пользуются – как минимум знают, что она есть, и используют стрелки «вверх» (отобразить предыдущую команду) и «вниз» (отобразить следующую после отображаемой команду в истории команд), чтобы выбрать, какую из ранее введенных команд либо снова выполнить, либо подредактировать и запустить отредактированную. Но помимо стрелок еще есть ряд полезных комбинаций клавиш, которые позволяют работать с историей команд, – быстрее находить нужные команды.

Ctrl-r – Поиск по истории

Комбинация позволяет искать в истории команд команды, содержащие указанный далее текст.

^^^ В этом примере мне понадобилось из истории вытащить команду, содержащую текст «su»: нажав и набрав искомый текст «su», я увидел самую недавнюю команду, содержащую «su»; при повторном нажатии отображается предыдущая команда, содержащая «su» и т.д. При необходимости изменить команду жму стрелку «вправо» и правлю текст, а чтобы запустить команду — нажимаю .

PgUp/PgDown – Поиск по истории

– отображает предыдущую команду начинающуюся с уже введенного текста, – следующую.

^^^ В этом примере перемещаюсь между командами, начинающимися с «cat». (Часто также ищу команды, начинающиеся с «sudo». Или если мне нужно снова отредактировать какой-то файл, который недавно редактировал: набираю «vi», жму несколько раз , а затем .)

Alt-_/Alt-./Alt— – вставка аргументов

Комбинация (выполняется нажатием , , ) – вставляет последний аргумент из предыдущих команд. (Аналогично работает комбинация или, что то же самое, )

^^^ В данном примере видно, как повторные нажатия вставляют аргументы от пред-пред-…-идущих команд.

Комбинация – позволяет указать (порядковый номер с конца), какой аргумент вставить клавишей из предыдущей команды.

^^^ В данном примере вставляю в командную строку различные аргументы из предыдущей команды.

Alt-# – текущую команду преобразовать в комментарий

Бывает, во время набора очень длинной команды понимаю, что мне нужно что-нибудь посмотреть или дополнительно сделать (например, глянуть, какие файлы есть в определенной директории, прочитать мануал по команде, установить нужный пакет…). Что делать с уже набранным текстом? Хотелось бы посмотреть нужную информацию и продолжить набирать команду, а не начинать печатать её сначала. (выполняется нажатием , , . Также можно использовать ) – преобразует текущую набранную команду в комментарий в истории – добавляет символ «#» в начало строки и добавляет полученную строку в историю команд.

Ctrl-o – повтор команд из истории

Комбинация позволяет повторять серию команд из истории. То есть нужно из истории команд стрелками выбрать первую команду из серии и нажать – это выполнит текущую команду и выведет из истории следующую. Дальше можно продолжать нажимать с тем же эффектом.

^^^ В примере я написал три команды: одна увеличивает на 1 переменную, которой соответствует год; вторая выводит переменную-год; третья показывает, сколько дней в феврале в указанном году. Дальше, нажимая , повторяю эту серию из трех команд много раз (один кадр соответствует трем нажатиям).

Общие слова и замечания

Большинство продемонстрированных клавиш стандартны для «командной строки Linux», но часть из этих комбинаций специфичны для bash (поэтому и пометил это в заголовке). На текущий момент BASH – наиболее распространенный командный интерпретатор, используемый по умолчанию в большинстве Linux-дистрибутивов. В других командных интерпретаторах или, проще говоря, shell’ах (рекомендую попробовать zsh и fish) могут быть небольшие отличия в работе. Также часть комбинаций прописана в «настройках по умолчанию» (например, в файле /etc/inputrc или в /etc/bashrc), которые тоже могут различаться в разных дистрибутивах. И бывает, что некоторые клавиши могут быть настроены и перехватываться графической оболочкой, в которой запущен командный интерпретатор.

Часть демонстрируемых клавиш относятся к «настройкам терминала». А часть – клавиши из командного интерпретатора BASH, и их можно посмотреть, почитав мануал по bash’у (огромный текст – пользуйтесь поиском):

^^^ На приведенном фрагменте из мануала: Запись «(C-r)» означает , а «M->» означает .

Для демонстраций нажатых клавиш использую утилиту «screenkey».

При этом стоит упомянуть, что по умолчанию bash использует emacs-режим редактирования командной строки и поэтому многие комбинации клавиш пришли из редактора emacs. Для знающих редактор vi, могу порекомендовать переключить (добавив «set -o vi» в ~/.bashrc) bash в vi-режим редактирования и пользоваться привычными комбинациями из vi.

85 Operating Systems

AIX, AmigaOS, Android, Aros, BeOS, Blackberry 10, Blackberry Tablet OS, Cell
OS, ChromeOS, Cisco IOS, Cygwin, Dragonfly BSD, eCOS, FreeBSD, FreeDOS,
FreeRTOS, Fuchsia, Garmin OS, Genode, Haiku, HardenedBSD, HP-UX, Hurd,
Illumos, Integrity, iOS, ipadOS, IRIX, LineageOS, Linux, Lua RTOS, Mac OS 9,
macOS, Mbed, Micrium, MINIX, MorphOS, MPE/iX, MS-DOS, NCR MP-RAS, NetBSD,
Netware, Nintendo Switch, NonStop OS, NuttX, OpenBSD, OpenStep, Orbis OS,
OS/2, OS/400, OS21, Plan 9, PlayStation Portable, QNX, Qubes OS, ReactOS,
Redox, RICS OS, Sailfish OS, SCO Unix, Serenity, SINIX-Z, Solaris, SunOS,
Syllable OS, Symbian, Tizen, TPF, Tru64, tvOS, ucLinux, Ultrix, UNICOS,
UnixWare, VMS, vxWorks, WebOS, Wii system software, Windows, Windows CE, Xbox
System, z/OS, z/TPF, z/VM, z/VSE

Legacy Windows and SSL

Schannel (from Windows SSPI), is the native SSL library in Windows. However, Schannel in Windows <= XP is unable to connect to servers that no longer support the legacy handshakes and algorithms used by those versions. If you will be using curl in one of those earlier versions of Windows you should choose another SSL backend such as OpenSSL.

Apple Platforms (macOS, iOS, tvOS, watchOS, and their simulator counterparts)

On modern Apple operating systems, curl can be built to use Apple’s SSL/TLS implementation, Secure Transport, instead of OpenSSL. To build with Secure Transport for SSL/TLS, use the configure option . (It is not necessary to use the option .)

When Secure Transport is in use, the curl options and and their libcurl equivalents, will be ignored, because Secure Transport uses the certificates stored in the Keychain to evaluate whether or not to trust the server. This, of course, includes the root certificates that ship with the OS. The and options, and their libcurl equivalents, are currently unimplemented in curl with Secure Transport.

In general, a curl build for an Apple combination can be taken by providing appropriate values for , , below and running the commands:

Above will build curl for macOS platform with architecture and as deployment target.

Here is an example for iOS device:

Another example for watchOS simulator for macs with Apple Silicon:

In all above, the built libraries and executables can be found in folder.

Android

When building curl for Android it’s recommended to use a Linux environment since using curl’s script is the easiest way to build curl for Android. Before you can build curl for Android, you need to install the Android NDK first. This can be done using the SDK Manager that is part of Android Studio. Once you have installed the Android NDK, you need to figure out where it has been installed and then set up some environment variables before launching . On macOS, those variables could look like this to compile for and API level 29:

When building on Linux or targeting other API levels or architectures, you need to adjust those variables accordingly. After that you can build curl like this:

Note that this will not give you SSL/TLS support. If you need SSL/TLS, you have to build curl against a SSL/TLS layer, e.g. OpenSSL, because it’s impossible for curl to access Android’s native SSL/TLS layer. To build curl for Android using OpenSSL, follow the OpenSSL build instructions and then install and to and copy to . Now you can build curl for Android using OpenSSL like this:

Note, however, that you must target at least Android M (API level 23) or will not be able to detect OpenSSL since (and the like) were not defined before Android M.

IBM i

For IBM i (formerly OS/400), you can use curl in two different ways:

  • Natively, running in the ILE

    You will need to build this from source. See packages/OS400/README for the ILE specific build instructions.

    . The obvious use is being able to call curl from ILE C or RPG applications.

  • In the PASE environment, which runs AIX programs. curl will be built as it would be on AIX.
    • IBM provides builds of curl in their Yum repository for PASE software.
    • To build from source, follow the Unix instructions.

There are some additional limitations and quirks with curl on this platform; they affect both environments.

Disabling Specific Protocols in Windows builds

The configure utility, unfortunately, is not available for the Windows environment, therefore, you cannot use the various disable-protocol options of the configure utility on this platform.

You can use specific defines to disable specific protocols and features. See CURL-DISABLE.md for the full list.

If you want to set any of these defines you have the following options:

  • Modify
  • Modify
  • Modify
  • Modify the «Preprocessor Definitions» in the libcurl project

Note: The pre-processor settings can be found using the Visual Studio IDE under «Project -> Settings -> C/C++ -> General» in VC6 and «Project -> Properties -> Configuration Properties -> C/C++ -> Preprocessor» in later versions.

Transferring files using the curl

«CURL» is a computer software project that provides a library (libcurl) and a command line tool called curl. Curl is a tool to transfer data to or from a server using one of the many supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP). Support for authentication , Proxy servers, transfer resume, SSL are all catered for. For the full list of functionality see the «man pages» for curl.

Below are examples of how to install curl on popular Linux distributions along with some useful examples of the curl tool in action.

Другие решения

SSH к вашему серверу и CD к /

Запустите приведенную выше команду find, чтобы определить местонахождение бинарного файла curl. Если вы не можете найти файл, вам может потребоваться установить curl и снова запустить команду find.

Теперь вам нужно отредактировать php.ini, используемый для запуска файлов php из cli (он отличается от того, который используется apache) и, скорее всего, находится в /etc/php5/cli/php.ini.

Вы также можете запустить

Чтобы получить путь к файлу, просто чтобы быть уверенным.

В вашем файле php.ini найдите , нажав ctrl + w

Теперь вы захотите добавить расширение к файлу, и оно должно выглядеть примерно так, хотя ваш путь к файлу curl.so и тому подобное может немного отличаться:

После выполнения вышеизложенного, я смог использовать curl в php-скриптах, запускаемых из cli.

Upgraded to Ubuntu 16.04 and facing problem after installing PHP5 .

Installed PHP-5 with following:

Trying to install php-curl but its not working.

Параметры скриптов

Для того, чтобы обеспечить некоторую универсальность, существует возможность при вызове передавать скрипту параметры. В этом случае вызов скрипта будет выглядеть так: , например .

Для того, чтобы получить значение первого параметра, необходимо в скрипте указать , второго — , и т.д. Существует также ряд других переменных, значения которых можно использовать в скрипте: – имя скрипта – количество переданных параметров – PID(идентификатор) процесса, выполняющего скрипт – код завершения предыдущей команды

Создадим файл script1.sh следующего содержания:

Выдадим права на выполнение и выполним скрипт с параметрами:

Мы передали 2 параметра, указывающие город и страну, и использовали их в скрипте, чтобы сформировать строку, выводимую командой printf. Также для вывода в строке Hello использовали имя пользователя из переменной USER.

Для того, чтобы передать значения параметров, состоящие из нескольких слов (содержащие пробелы), нужно заключить их в кавычки:

При этом нужно доработать скрипт, чтобы в команду printf параметры также передавались в кавычках:

Из приведенных примеров видно, что при обращении к переменной для получения её значения используется символ $. Для того, чтобы сохранить значение переменной просто указывается её имя:

Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds

In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack it is necessary to make definition of preprocessor symbol visible to libcurl and curl compilation processes. To set this definition you have the following alternatives:

  • Modify and
  • Modify
  • Modify the «Preprocessor Definitions» in the libcurl project

Note: The pre-processor settings can be found using the Visual Studio IDE under «Project -> Settings -> C/C++ -> General» in VC6 and «Project -> Properties -> Configuration Properties -> C/C++ -> Preprocessor» in later versions.

Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, in order to use it with your program it is mandatory that your program includes lwIP header file (or another lwIP header that includes this) before including any libcurl header. Your program does not need the preprocessor definition which is for libcurl internals only.

Compilation has been verified with lwIP 1.4.0 and contrib-1.4.0.

This BSD-style lwIP TCP/IP stack support must be considered experimental given that it has been verified that lwIP 1.4.0 still needs some polish, and libcurl might yet need some additional adjustment, caveat emptor.

85 Operating Systems

AIX, AmigaOS, Android, Aros, BeOS, Blackberry 10, Blackberry Tablet OS, Cell OS, ChromeOS, Cisco IOS, Cygwin, Dragonfly BSD, eCOS, FreeBSD, FreeDOS, FreeRTOS, Fuchsia, Garmin OS, Genode, Haiku, HardenedBSD, HP-UX, Hurd, Illumos, Integrity, iOS, ipadOS, IRIX, LineageOS, Linux, Lua RTOS, Mac OS 9, macOS, Mbed, Micrium, MINIX, MorphOS, MPE/iX, MS-DOS, NCR MP-RAS, NetBSD, Netware, Nintendo Switch, NonStop OS, NuttX, OpenBSD, OpenStep, Orbis OS, OS/2, OS/400, OS21, Plan 9, PlayStation Portable, QNX, Qubes OS, ReactOS, Redox, RICS OS, Sailfish OS, SCO Unix, Serenity, SINIX-Z, Solaris, SunOS, Syllable OS, Symbian, Tizen, TPF, Tru64, tvOS, ucLinux, Ultrix, UNICOS, UnixWare, VMS, vxWorks, WebOS, Wii system software, Windows, Windows CE, Xbox System, z/OS, z/TPF, z/VM, z/VSE

Использование Curl

В простейшем виде, когда используется без каких-либо опций, Curl отобразит ресурс, указанный в , к стандартному выводу.

Например, команда ниже напечатает исходный код домашней страницы example.ru в окне вашего терминала:

Для загрузки файла с помощью Curl вы можете использовать либо флаги, -o либо -O.

Нижний регистр -o позволяет указать имя файла, который вы скачиваете:

Прописной буквой -O сохранять файл с его исходным именем файла:

Еще одна полезная функция Curl -I, это возможность извлекать только заголовки HTTP указанного URL:

С помощью Curl вы также можете загружать файлы с защищенных паролем FTP-серверов:

MingW32

Make sure that MinGW32’s bin dir is in the search path, for example:

set PATH=c:\mingw32\bin;%PATH%

then run in the root dir. There are other
make targets available to build libcurl with more features, use:

  • to build with Zlib support;
  • to build with SSL and Zlib enabled;
  • to build with SSH2, SSL, Zlib;
  • to build with SSH2, SSL, Zlib
    and SSPI support.

If you have any problems linking libraries or finding header files, be sure
to verify that the provided files use the proper paths, and
adjust as necessary. It is also possible to override these paths with
environment variables, for example:

set ZLIB_PATH=c:\zlib-1.2.8
set OPENSSL_PATH=c:\openssl-1.0.2c
set LIBSSH2_PATH=c:\libssh2-1.6.0

It is also possible to build with other LDAP SDKs than MS LDAP; currently
it is possible to build with native Win32 OpenLDAP, or with the Novell CLDAP
SDK. If you want to use these you need to set these vars:

set LDAP_SDK=c:\openldap
set USE_LDAP_OPENLDAP=1

or for using the Novell SDK:

set USE_LDAP_NOVELL=1

If you want to enable LDAPS support then set LDAPS=1.

Автодополнение

Tab – автодополнение (в контексте)

Во многих командных интерпретаторах (и в bash в том числе) используется такая возможность, как автодополнение. Как минимум нужно знать, что по нажатию клавиши дописывается название команды. В bash по умолчанию обычно настроено так, что если имеется только один вариант дополнения, то он дописывается по нажатию (также можно использовать и ). Когда вариантов дополнения много, то по первому нажатию дописывается только общая часть (если она есть). А по второму нажатию отображается список всех доступных вариантов. Дальше можно набрать еще символов – уточнить, какое из дополнений нужно, и снова нажать . То же самое с другими дополнениями: имен файлов, имен переменных.

^^^ Здесь, например, смотрю (нажав дважды ), что есть несколько команд, начинающихся с «if», добавив «c» и нажав , получаю набранной команду «ifconfig».

^^^ В этом примере дополняю аргументы команды (здесь имена файлов). Также видно, что в случае, когда вариантов много и все не умещаются в окне терминала, их список отображается утилитой для постраничного просмотра (также при очень большом списке вариантов выдается запрос вида «Display all 125 possibilities? (y or n)» или, как в этом примере, при малом количестве — «—More—».

Дополнения имен пользователей, переменных

Часто, когда дописываются аргументы команд по , дописываются имена файлов. Но стоит также отметить, что, в зависимости от контекста, по дописываются и имена переменных (аргументы, начинающиеся с символа «$»), имена пользователей (аргументы, начинающиеся с символа «~»),…

^^^ Здесь, чтобы набрать «$HISTFILESIZE», вместо 13 символов набрал 8 символов ( ). Помимо того, что так быстрее, это еще и позволяет допускать меньше ошибок при наборе команд, так как не просто печатаю текст, а выбираю из списка установленных переменных.

^^^ Здесь дописываю имена пользователей (фактически пишу адрес домашней директории).

Также bash может дополнять не потому, что набранный текст начинается с определенного символа, а по определенным комбинациям клавиш.

Список того, что может дополнять bash, можно посмотреть командой:

Так, например, видно, что:

  • – покажет список имен пользователей, начинающихся с набранных символов, а дополнить комбинацией ;

  • – список имен машин (согласно /etc/hosts), начинающихся с набранных символов, а дополнить – ;

  • – список имен переменных, заданных в этой сессии (можно их также посмотреть командой set), а дополнить – ;

  • – список команд (согласно доступных: $PATH, alias, функций, встроенных команд), а дополнить – ;

  • – список имен файлов, а дополнить – .

Alt-* – вставить дополнения, Ctrl-x * – развернуть шаблон

(точнее, ) или, что, то же самое, (точнее, , , ), вставит все варианты дополнения в командную строку. Аналогично можно развернуть список файлов, переменных, имен пользователей.

В примерах ниже разворачиваю список файлов:

Вариант с :

Вариант с :

– развернет уже написанный в командной строке шаблон, как в примере ниже:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: