Esto funciona:
sudo $(which your_command)
Ejemplo llamando a mi script gps
que enumera los procesos de GPU Nvidia:
$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
PID TTY TIME CMD
9922 tty7 02:42:47 Xorg
Explicación:
$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
PID TTY TIME CMD
9922 tty7 02:42:39 Xorg
+ set +x
Я сам уже получил ответ. Оказывается, я могу выполнить команду echo
или curl
с помощью sudo, если использую bash -c
вот так:
sudo bash -c 'echo extension=pdo_sqlsrv.so >> "$(php --ini | grep "Scan for additional.ini files" | sed -e "s|.*:\s*||")/pdo_sqlsrv.ini"'
спасибо всем, кто мне помог:)
Команда используется для получения пути к каталогу ваших дополнительных файлов конфигурации php для создания новых *.ini
файлов.
Если я запускаю команду php --ini
, она перечисляет мои файлы конфигурации и пути, подобные этому:
$ php --ini
Configuration File (php.ini) Path: /etc/php/7.2/cli
Loaded Configuration File: /etc/php/7.2/cli/php.ini
Scan for additional.ini files in: /etc/php/7.2/cli/conf.d
Additional.ini files parsed: /etc/php/7.2/cli/conf.d/10-opcache.ini,
/etc/php/7.2/cli/conf.d/10-pdo.ini,
/etc/php/7.2/cli/conf.d/20-calendar.ini,
...
Вы можете увидеть строку Scan for additional.ini files in: /etc/php/7.2/cli/conf.d
. grep
используется для получения этой конкретной строки, а команда sed
используется для удаления Scan for additional.ini files in:
и сохранения пути к каталогу конфигурации /etc/php/7.2/cli/conf.d
.
Таким образом, первая команда добавляет строку extension=pdo_sqlsrv.so
к файлу /etc/php/7.2/cli/conf.d/pdo_sqlsrv.ini
, и в вашем случае это /etc/php.d/pdo_sqlsrv.ini
.
Обратные галочки в некотором роде эквивалентны $()
, но их сложнее использовать. В данном случае они эквивалентны. Таким образом, код может читаться как.
echo extension=pdo_sqlsrv.so >> "$(php --ini | grep "Scan for additional.ini files" | sed -e "s|.*:\s*||")/pdo_sqlsrv.ini"
echo extension=sqlsrv.so >> "$(php --ini | grep "Scan for additional.ini files" | sed -e "s|.*:\s*||")/sqlsrv.ini"
Для каждой строки сначала запускается бит в $()
, а вместо него подставляется вывод (stdout ). Затем вся строка повторно -сканируется и запускается снова.
Поэтому бит в $()
используется для создания имени каталога, а текстextension=pdo_sqlsrv.so
(для первого )добавляется к «directory»/pdo_sqlsrv.ini
Я провел рефакторинг как (не проверенный, так как не собираюсь устанавливать php ). Надеюсь, теперь это имеет смысл.
directory="$(php --ini | grep "Scan for additional.ini files" | sed -e "s|.*:\s*||")"
echo extension=pdo_sqlsrv.so >> "${directory}/pdo_sqlsrv.ini"
echo extension=sqlsrv.so >> "${directory}/sqlsrv.ini"