我想php.ini
通过终端更改一些 (php5.6) 变量。示例:我需要获取值post_max_size
(目前为8M
),将其显示在终端中,将其更改为2048M
并再次显示。
我怎能这样做?
答案1
得到:
grep '^post_max_size ' php.ini
代替:
sed -i 's,^post_max_size =.*$,post_max_size = 2048M,' php.ini
php.ini
请注意,在运行之前创建备份是个好主意sed
:
cp php.ini php.ini.bak
答案2
我假设您存储的值php.ini
每行一个,并用空格分隔,=
也可以不带空格。变量名和值都不包含=
。
到打印值post_max_size
(选择一个):
<php.ini awk -F"= *" '/^ *post_max_size/{print$2}'
<php.ini sed '/^ *post_max_size/!d;s/.*= *//'
<php.ini grep -oP '^ *post_max_size *= *\K.*'
到改变创建备份的post_max_size
价值在于:2048M
php.ini.bak
sed -i.bak '/^ *post_max_size/s/=.*/= 2048M/' php.ini
解释
<php.ini awk -F"= *" '/^ *post_max_size/{print$2}'
<php.ini
– 让 shell 打开php.ini
并将其分配给程序的标准输入,这有许多优点,请参阅这里-F"= *"
– 设置=
后跟零个或多个空格字符作为字段分隔符/^ *post_max_size/{print$2}
post_max_size
– 从以print field开头的行开始2
<php.ini sed '/^ *post_max_size/!d;s/.*= *//'
/^ *post_max_size/!d
–d
删除除以 开头的行之外的所有行post_max_size
s/.*= *//
–用空字符s
替换其前面的所有内容=
以及其后的零个或多个空格字符(=删除它)
<php.ini grep -oP '^ *post_max_size *= *\K.*'
-oP
–o
仅打印匹配行的匹配部分并使用P
erl 兼容正则表达式 (PCRE)^ *post_max_size *= *\K.*
– 搜索以零个或多个空格字符开头post_max_size
并被=
其包围的行,然后从整体正则表达式匹配 ( ) 中删除迄今为止匹配的文本,\K
并匹配其后的所有内容
sed -i.bak '/^ *post_max_size/s/=.*/= 2048M/' php.ini
-i.bak
– 更改文件i
n 位置并使用扩展名进行备份.bak
/^ *post_max_size/…
– 在以 开头的行中post_max_size
执行…
s/=.*/= 2048M/
–s
ubstitute=
及其后的所有内容= 2048M
答案3
我编写了一个简单的 bash 脚本来实现 Arkadiusz Drabczyk 的答案。
该脚本自动检测 php 的活动版本。
该脚本假定您正在使用 apache2(您可以传递第三个参数来覆盖)。
我命名了该文件php-iniset
并将其添加到我的一个 bin 目录中。
现在你可以调用:
php-iniset post_max_size 2048M
或者像这样调用它来注释掉变量:
php-iniset post_max_size
您可能需要根据需要调整文件路径等内容
请记住先备份你的 ini 文件!
脚本如下:
#!/bin/bash
#
# useage:
# php-iniset key value
#
# sets php ini key to value
# if no value is supplied key will be commented
# If value is supplied key will automatically be commented out
#
key=$1
val=$2
scope=${3:-apache2}
version=`php -r "echo substr(PHP_VERSION, 0, 3);"`
filepath="/etc/php/$version/$scope/php.ini"
if [ -f $filepath ]
then
if [ -e $val ]
then
#disable if value is empty
sudo sed -i "/^$key =.*$/s/^/;/g" $filepath
#confirm disabled
grep "^;$key " $filepath
else
#enable if value has been supplied
sudo sed -i "/^;$key =.*$/s/^;//g" $filepath
#modify value
sudo sed -i "s,^$key =.*$,$key = $val," $filepath
#confirm value
grep "^$key " $filepath
fi
else
echo "$path does not exist"
fi