Mac中一些有用的冷门命令

本文最后更新于:2022年9月5日 早上

Mac中一些有用的冷门命令

苹果系统自带的设置可以调整许多设置,但不是全部。有些设置隐藏在“百度区”中,只有在受其困扰遂上网搜索时才会发现。本文收集了一些我自己用到过的指令并解释了其用法,希望能对大家有所帮助。打开Terminal,输入本文提到的命令,探索新大陆。

不要随便在命令行中输入你不了解的指令,正如不要随便安装你不了解的软件。它们可能会修改系统文件对你的使用体验造成不可逆的影响,也可能在系统中你不知道的位置留下一点足迹(俗称“拉屎”),日积月累磁盘空间就被蚕食掉了。本文提到的指令都配套了与之对应的解除此设置的指令,如果你不喜欢某设置可以改回去,不会对你的系统造成影响

1.日常

1.1.解决软件打不开

1
2
3
sudo xattr -r -d com.apple.quarantine [你软件的.app绝对路径]
# 强制加签名
sudo codesign --force --deep --sign - 文件位置(直接将应用拖进去即可)

系统会自动为一些文件打上“备份”的属性标签,包括来自网络的文件以及自己写的脚本等。被打上此标签的可执行程序是不允许执行的。例如,如果你写了一个脚本就像在Windows和Linux中常做的那样,无论是执行需要何种权限的命令,也无论脚本类型是.sh,.command,.bash或者是根本没有拓展名,你的脚本是根本不可能双击执行的,一定会显示权限不够。

这条语句可以去除这个“备份”标签,解除这个障碍(当然你得手动给你的脚本+x的权限,这在任何系统中都一样)。这不会对你正常使用文件产生任何影响。

2022.4.16更新,command脚本如果在第一行指定了#!/bin/zsh那么给执行权限就可以执行,就不需要删除com.apple.quarantine属性了。否则就需要那样操作才能执行脚本。

如果破解软件由于没有签名无法启动,可以通过手动强制本地签名的方式为其签名。

1.2.解决conda环境自动激活

1
2
conda config --set auto_activate_base true
conda config --set auto_activate_base false

有时我们不希望所有的环境都混在一起,但是自从安装了conda,每次打开命令行都会自动激活base环境。可以通过以上语句控制base环境是否自动开启。

1.3.控制Dock栏自动隐藏的动画速度

1
2
sudo defaults write com.apple.Dock autohide-delay -float 0 && killall Dock
sudo defaults delete com.apple.Dock autohide-delay && killall Dock

苹果默认的动画很丝滑,但不是所有人都愿意看过渡动画。有些人就是喜欢“来也匆匆去也匆匆”的系统,那么可以使用以上指令修改系统关闭或开启此动画。也可以尝试修改其中的值来调整到合适的速度。

注意&&用来连接先后执行的两条指令,在此设置中killall Dock必不可少,只有Dock自动重启后修改的设置才会生效。

1.4.修改启动台图标数量

1
2
3
sudo defaults write com.apple.dock springboard-columns -int 10
sudo defaults write com.apple.dock springboard-rows -int 8
killall Dock

启动台图标很大,有些人安装了很多软件以至于想要使用时不好找(当然也可以用“聚焦”来快速搜索,但是谁能记住所有软件的名字呢)。使用上述指令可以调整启动台默认展示图标的列数、行数。只有Dock自动重启后修改的设置才会生效。

注意行列数改多不会让图标间隔变小,只会让图标变小。苹果的图标全部是按照像素点点对点制作,缩放后可能看着有点模糊。默认的数值是5行7列,我实际体验下来还是默认的最好用。

1.5.在Dock栏上添加空白分隔

1
2
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
defaults write com.apple.dock persistent-others -array-add '{tile-data={}; tile-type="spacer-tile";}'; killall Dock

Dock栏上有时软件会很多,看起来眼花缭乱不方便找软件,此时可以使用上面的指令为Dock栏添加几个空白,可以随意将它们拖到合适的地方。如果不需要这空白了,只要像移除Dock栏上的其他图标一样拖出去即可删除。本质上此指令是修改Dock栏配置文件,添加一个不指向任何东西的空白图标。

注意Dock栏中的短竖线左侧为软件区域,右侧为文件及文件夹区域,左右两侧的空白不互通,对应的两条指令也不同。

image-20220403135431099

1.6.查看系统唤醒

1
pmset -g assertions

一般来说苹果电脑关盖就会进入睡眠状态,立即将所有内存数据写入磁盘,几个小时后断开除内存外其他所有硬件的电源。这种睡眠方式理论上是非常省电的,但是系统有可能会被一些情况唤醒,甚至是频繁唤醒,导致电量快速消耗。使用此指令可以检查电脑被什么进程唤醒了,如果是系统进程可以考虑是否要关闭,如果是第三方软件可以考虑是否要卸载(本人有强迫症对流氓软件零容忍)。

1.7.设置电脑名称

1
sudo scutil --set HostName Mac

一般来说命令行会显示你在系统偏好设置“共享”中设置的电脑名,但是也有些特殊情况,比如路由器DHCP服务突然挂了,它会给电脑分配一个169.254网段的地址,电脑此时就会自动改名为“bongu”,网络恢复后不会恢复,更改共享中的电脑名也不会恢复。不影响什么,但是使用命令行时看着心里不舒服。此时可以使用这条指令改名。

1.8.显示隐藏文件

1
sudo defaults write com.apple.finder AppleShowAllFiles TRUE && killall Finder

一般来说苹果电脑会自动隐藏掉隐藏文件,因为那些配置文件和软件运行库文件夹不是普通用户需要操心的,隐藏掉看起来会非常整洁。不过我等程序员显然不喜欢自己电脑用起来像别人的电脑。虽然使用⌘+⇧+.可以临时控制显示或者隐藏文件,但是每次重启电脑都要重新选择显示所有文件,这样不够elegant。使用此命令可以直接设置默认始终显示隐藏文件。参考前面的几条指令,将TRUE替换为FALSE可以设置默认不显示隐藏文件,将write替换为delete可以删除刚刚设置的默认配置。

1.9.设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/
export CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

#/Library/Java/apache-maven-3.8.4
export MAVEN_HOME=/Library/Java/apache-maven-3.8.4/
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

#/usr/local/mysql
export PATH=/usr/local/mysql/bin:$PATH

#/usr/local/mongodb
export PATH=/usr/local/mongodb/bin:$PATH

alias ll='ls -l'
alias python='python3'
alias aaasss='cd ~/Desktop/桌面文件/Blog'
alias aaaddd='open ~/Desktop/桌面文件/Blog/source/_posts'

# /usr/local/lib/node_modules/picgo/bin/picgo
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
export PATH=/usr/local/lib/node_modules/picgo/bin:$PATH

显示隐藏文件后,在用户家目录下可以看到一个隐藏文件.bash_profile,这就是用户环境变量,你可以仿照我的写法写适合你自己的环境变量。还能看到一个隐藏文件名为.zshrc,这是zsh的默认配置文件,在用户打开Terminal时自动加载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/zql/miniforge3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/zql/miniforge3/etc/profile.d/conda.sh" ]; then
. "/Users/zql/miniforge3/etc/profile.d/conda.sh"
else
export PATH="/Users/zql/miniforge3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<

source ~/.bash_profile

.zshrc中的前14行都由我安装Miniforge时自动生成,这是控制conda环境的语句。第16行由我自己添加,这一句的意思是,每次打开黑窗口时自动刷新一次环境变量。使用这个方法可以在日常使用开发工具时解决复杂的环境问题,也可以使用alias语法自定义常用的指令。

注意使用此方式配置的环境变量只能在用户自己点击Terminal时使用。软件在调用命令时不会加载环境变量,因此找不到目录时可能要考虑使用完整绝对路径。例如我在使用typora搭配picgo配置图床时typora一直显示找不到指令。

1.10.切换最高权限

Mac购买之初会要求创建一个用户,此用户为管理员账户,但在Terminal中一般运行在普通权限下,需要特殊权限比如sudo的时候会要求用户输入密码。在图形界面下不能指定使用管理员用户,也就是不能像linux直接使用root用户操作那样。但是在Terminal中可以切换到管理员权限:

1
2
sudo su # 管理员权限
exit # 退出此状态

值得注意的是,此状态权限仍小于“系统权限”,比如/usr/bin这个目录无论如何你是无法编辑的,因为Mac有系统完整性保护(SIP)。而且最新的机器似乎保护更严格,即使关闭了SIP仍然不能编辑系统某些内容(比如删掉系统自带某些软件),因为它们是“只读的镜像”,这可能是通过其特殊的文件系统实现的。

顺带一提,电脑中只有一个用户时不要给用户改名。如果想改名可以通过新建一个用户然后将其加入管理员用户组。直接改名会导致直接失去管理员权限,然后你就没权限新建一个管理员了🤪。当然已经跳坑了也有办法解决,进启动界面用安全模式命令行新建一个管理员账户。这个操作在M1芯片和Intel芯片的Mac上不同,具体请参考官方客服。

1.11.修改终端默认样式

Mac默认的shell是zsh,默认是白底黑字的。在.bash_profile中添加如下语句并刷新环境变量可以使终端高亮并使用linux默认颜色配置模式。

1
2
3
4
export CLICOLOR='Yes'
# export LS_OPTIONS='--color=auto'
export LSCOLORS='ExGxFxdaCxDaDahbadacec'
# 指定颜色,Linux配色方案

在自己的电脑上使用终端可能不需要那么多的输入提示,例如“abc@mac ~%”,此时可以编辑.zshrc修改默认配置样式,使用source .zshrc刷新设置后生效。

1
2
3
# %n是用户名,%m是主机名
# %1是当前目录,用户家目录会被替换为~
export PROMPT='%n@%m %1~ %# '

默认提示也可以改点颜色:

  • %F{color} 是配置颜色,{}中color是256色的颜色值,也可以使用black,red,green,yellow,blue,magenta,cyan和white等常用色
  • %f 表示后面恢复默认颜色
  • %B 粗体
  • %b 表示后面恢复默认字重

我的个人配置如下:

1
export PROMPT='%F{13}%1~ %F{50}%B%# %f%b'

1.12.查看硬盘寿命

1
2
3
4
5
6
# 安装smartmontools
brew install smartmontools
# 打开S.M.A.R.T监控
smartctl -s on disk0
# 查看硬盘信息
smartctl -a disk0

1.13.取消系统截图阴影

系统自带的截图是唯一一个能截出圆角的截图方式,然而一般会带着窗口阴影一起截下来。使用下面指令可以取消阴影。

1
2
3
4
# 取消系统截图阴影
defaults write com.apple.screencapture disable-shadow -bool TRUE
# 恢复系统截图阴影
defaults write com.apple.screencapture disable-shadow -bool FALSE

2.defaults命令

plist文件在macOS中被用来记录系统的各种偏好设置,所有与系统有关的设置项文件都在/Library/Preferences中。使用defaults命令可以修改这些设置甚至是写入自己的设置。设置项可能导致软件崩溃,移除设置项可以直接删除配置文件或者使用给出的命令。

1
2
3
4
5
6
7
8
9
10
# 读取所有设置项
defaults read [DOMAIN]
# 读取某设置项
defaults read [DOMAIN] [PROPERTY_NAME]
# 设置某设置项
defaults write [DOMAIN] [PROPERTY_NAME] [VALUE]
# 重制某个设置项
defaults delete [DOMAIN] [PROPERTY_NAME]
# 重制某个设置
defaults delete [DOMAIN]

3.xattr命令

Mac OS X 10.4及更高版本通过使用HFS+文件系统属性文件B树功能支持*扩展属性。每个属性由一个名称和相关数据组成,该名称是一个以\0截止的Unicode字符串。

1
2
3
4
5
6
7
8
9
10
11
12
# 显示所有扩展属性名称,效果与"ls -l@"相同
xattr [-lrsvx] file ...
# 显示与给定属性名称关联的值。通常是字符串,但如果有空值则以16进制显示
xattr -p [-lrsvx] attr_name file ...
# 给一个属性设置一个值
xattr -w [-rsx] attr_name attr_value file ...
# 将某属性以及与之对应的值一起删除
xattr -d [-rsv] attr_name file ...
# 清除所有属性以及与之对应的值
xattr -c [-rsv] file ...
# 显示一个简短的帮助信息并立即退出
xattr -h | --help

可选选项:

  • -l,将表单和值对应起来进行显示
  • -r,递归地处理
  • -s,如果文件参数是符号链接,对符号链接本身采取行动而不是它指向的文件
  • -v,强制运行结果中显示文件名(默认只有一个文件时不现实文件名)
  • -x,强制属性值用16进制表示

这个东西官方还做了C语言的API,但是咱平时也用不着,这里就不写了,官方文档放上:显示xattr获取xattr设置xattr移除xattr

4.pmset命令

在macOS中系统偏好设置提供的电源设置项显然太少了。您能分辨这些情况下电脑中的程序是否还会运行吗?

  • 不关盖,放至黑屏后
  • 不关盖,按指纹键锁屏
  • 插着电源关盖
  • 插着电源关盖,然后拔出电源
  • 不插电源关盖,然后插入电源

image-20220405174159263

实际上,macOS的pmset命令为我们提供了更丰富的设定。以下介绍参考了维基百科

4.1.选择设置对象

设置的对象默认为全部场景,否则请指定场景。指定场景命令不能单独使用,必须和其他指令组合使用,否则不会生效。

  • -c(充电器),调整连接到充电器时使用的设置
  • -b(电池),调整使用本机电池时使用的设置
  • -u(UPS),调整运行UPS时使用的设置
  • -a(所有,默认)调整所有场景的设置

4.2.设置唤醒、睡眠、开机或关机

可以根据一周中任意的一天和时间组合重复发生,也可以设置在未来的日期和时间。语法如下:

1
pmset [repeat, schedule] [sleep, wake, poweron, shutdown, wakeorpoweron] [<MTWRFSU> <date/time>]

schedule参数用于设置一次性电源事件,repeat用于设置每日或每周事件。事件的调度只能由特权用户完成。每次设置都会覆盖以前的设置,因此想要设置多个触发事件必须在一个命令字符串中输入它们。schedule参数识别以下附加参数:

  • 类型。sleep、wake、poweron、shutdown或wakeorpoweron
  • 日期和时间(仅限schedule)。格式为”MM/dd/yy HH:mm:ss”必须为24小时格式,必须加引号
  • 时间(仅repeat)。格式为HH:mm:ss;必须为24小时格式,但不必加引号
  • 工作日。MTWRFSU的子集,如M、MTWRF、weekdays、weekends和everyday都可以
  • 所有者。描述是谁正在安排电源事件的人或程序(可选)

举例:要将一周中每天的关机事件设置为23:59,并将一周中每天的唤醒或开机事件设置为7:00

1
sudo pmset repeat shutdown MTWRFSU 23:59:00 wakeorpoweron MTWRFSU 7:00:00

语法限制很严格,任何错误都将导致命令失败,并将显示一条简短的帮助消息。计划事件设置存储在专用硬件中,因此“黑苹果”上此功能可能不稳定。重复事件存储在/Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist中,此文件可以使用defaults命令手动编辑,但更改有可能被覆盖;更改后不会立即生效。

4.3.查看所有电源管理配置项

-g显示有关当前电源管理配置的信息,或最近活动的日志。如果没有提供其他参数,仅显示当前设置;如果后面跟了其他参数则显示此参数的详细设置项。如果提供了多个参数,那么只有第一个参数是有用的,多余的参数会被忽略。

  • -g live,显示当前正在使用的设置
  • -g custom,显示所有电源的自定义设置
  • -g cap,显示机器支持哪些电力管理功能
  • -g sched,显示计划启动、唤醒或关闭、睡眠事件
  • -g ps / batt,显示电池和 UPS 的状态
  • -g pslog,显示电源(电池或者 UPS)状态的连续日志
  • -g rawlog,显示直接读取电池的电池状态的连续日志
  • -g therm,显示影响 CPU 速度的温度阈值。不适用于全部平台
  • -g thermlog,显示影响 CPU 速度的温度的通知日志。不适用于全部平台
  • -g assertions,显示电量提醒的概要。此提醒可以阻止系统睡眠或显示器睡眠。适用于 10.6 及更新版本
  • -g assertionslog,显示电量提醒的日志。适用于 10.6 及更新版本
  • -g sysload,显示“系统负载顾问”——。适用于 10.6 及更新版本
  • -g ac/adapter,显示关于交流电源适配器的详情。只有 MacBoook 和 MacBook Pro 支持。
  • -g log,显示睡眠,唤醒及其他电源管理时间的历史。这个日志只提供给管理员和调试目的
  • -g uuid,显示当前活跃的睡眠、唤醒的 UUID。
  • -g uuidlog,显示当前活跃的睡眠、唤醒的 UUID,并且打印一个新的被系统设置的 UUID
  • -g history,一个调试工具。当使用启动参数 io=0x3000000 被启用时,打印系统睡眠唤醒的 UUID 的时间线。
  • -g powerstate,打印当前为 IO Kit 驱动电源状态。调用者应该至少提供一个 IO Kit 类名来作为参数。如果没有类名被听过,它将打印全部驱动的电源状态。
  • -g stats,打印自系统启动以来睡眠和唤醒系统的计数。
  • -g systemstate,打印当前系统的电量状态和可用能力。
  • -g everything,打印每个参数。这是一个有用的快速收集所有 pmset 提供的输出。适用于 10.8。

4.4.配置休眠和安全睡眠选项

pmset可以识别以下参数,它们可以按任何顺序给出。任何错误的语法或无法识别的参数都将导致整个命令失败,这会在屏幕上打出一个log和一个简短的帮助文档。电源管理设置只能使用sudo权限修改。

通过pmset进行的所有更改都将保存在/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist的持久首选项文件中。可以使用defaults命令手动修改此文件,但电源管理系统不会立即处理这些更改。对配置文件的手动编辑有可能被覆盖。pmset touch命令将从磁盘上重读现有设置并应用。

  • displaysleep,控制显示器无操作几分钟后灭屏,0以禁用显示睡眠
  • disksleep,控制磁盘几分钟无操作后自动断电,0以禁用磁盘睡眠
  • sleep,无操作几分钟后系统睡眠(所有程序暂停),0以禁用睡眠
  • womp,允许以太网数据包唤醒,设为1以启用或0以禁用。只有当设备插入电源时才会显示此设置,否则运行“pmset -g”时不会有womp设置项
  • hibernatemode,更改休眠模式。(0/3/25以外的选项慎用
    • 0,休眠时只有内存通电
    • 1,内存数据写入磁盘,然后电脑完全断电
    • 3,内存数据写入磁盘,同时保持内存供电
    • 5,与模式1大致相同,但适合安全地处理虚拟内存的数据
    • 7,与模式3大致相同,但适合安全地处理虚拟内存的数据
    • 25,与模式1大致相同,用于Mac OS X 10.7中的休眠
  • hibernatefile,更改休眠时内存映象储存的位置。只能位于根卷上
  • ring,允许通过调制解调器唤醒,1启用或0禁用
  • autorestart,电池寿命检测到损耗时自动重启,1启用或0禁用
  • dps,根据负载动态地调整处理器速度,1启用或0禁用
  • reduce,保持降低处理器速度,1启用或0禁用
  • powerbutton,按下电源键时进入睡眠而不是关机,1启用或0禁用
  • powernap,让机器即使在睡眠时也能保持最新状态(接收更新和时钟同步等),1可以启用,0可以禁用
  • lidwake,(仅限笔记本)开盖时唤醒机器,1启用或0禁用
  • acwake,(仅限笔记本)当电源更换(插上或拔下充电线)时唤醒机器,1启用或0禁用
  • lessbright,(仅限笔记本)切换到指定电源时略微调低显示屏亮度,1启用或0禁用
  • halfdim,显示器睡眠时将亮度调到一半,1启用或0禁用
  • sms,(仅支持笔记本)感受到加速度时自动锁定机械硬盘的磁头,1启用或0禁用
  • haltlevel,(仅限UPS)当UPS仅剩某百分比电量时电脑自动关机
  • haltafter,(仅限UPS)使用UPS供电指定分钟数后电脑自动关机
  • haltremain,(仅限UPS)当UPS仅剩指定分钟数时电脑自动关机
  • ttyskeepawake,当任何tty(例如远程登录会话)处于活动状态时阻止空闲系统睡眠,除非其空闲时间超过系统睡眠计时器,1启用或0禁用时,tty才处于非活动状态
  • autopoweroff,(交流电源)如果系统支持的话,默认启用欧洲标准的能源节省计划。进入睡眠后超过设置的时间后,内存数据写入磁盘,进入低功率芯片组睡眠。从这种状态唤醒比从正常睡眠中醒来需要更长的时间。如果连接任何外设、或系统处于电池供电状态、或系统联网并启用了唤醒网络访问,系统将不会自动关机。1启用或0禁用
  • autopoweroffdelay,(交流电源)设置进入自动关机模式前的时间,整数,以秒为单位
  • standbydelaylow,将休眠映像写入磁盘并内存断电的等待时长。低电量时启用,整数,以秒为单位
  • standbydelayhigh,将休眠映像写入磁盘并内存断电的等待时长。高电量时启用,整数,以秒为单位
  • networkoversleep,此设置会影响macOS是否在睡眠期间显示共享网络服务。并非所有平台都使用此设置;不支持更改其值
  • destroyfvkeyonstandby,进入睡眠模式时销毁文件保险库密钥。默认情况下,即使系统处于待机状态,文件保险库键也会保留。如果密钥被销毁,将提示用户在退出待机模式时输入密码。1 - 销毁,0 - 保留。由于系统必须完全关机,您还需要将“hibernatemode”设置为25。

举例:设置仅由电池供电时,10 分钟后进入睡眠状态,并在 5 分钟后将显示屏设置为睡眠状态

1
pmset -b sleep 10 displaysleep 5

举例:当连着充电器时,设置30分钟后入睡,显示器设置为永不入睡

1
pmset -c sleep 30 displaysleep 0

$\ $

参考文档

  1. unix官方文档:显示xattr
  2. unix官方文档:获取xattr
  3. unix官方文档:设置xattr
  4. unix官方文档:移除xattr
  5. 维基百科:pmset

本博客所有文章除特别声明外均为原创,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!