Mac shell使用技巧总结

2016/08/29

整理了部分mac使用技巧以及Linux学习路线

常用操作

1.文件操作

  • 常用目录
/Systme/Library/Extensions		// 驱动所在目录
/User/XXX/Desktop				// 桌面目录
  • 资源库
chflags nohidden ~/Library/		// 显示资源库
chflags hidden ~/Library/		// 隐藏资源库
  • 目录
命令名 功能描述 使用举例
mkdir 创建一个目录 mkdir XXX
rmdir 删除一个目录 rmdir XXX
mvdir 移动或重命名一个目录 mvdir XXX XXX
cd 进入目录 cd XXX
cd .. 回到上一目录 cd ..
cd ~ 回到用户根目录 cd ~
pwd 显示当前目录的路径名 pwd
ls 显示当前目录的内容 ls -al
open 打开当前目录 open .
  • 文件操作
命令名 功能描述 使用举例
cat 显示或连接文件 cat XXX
od 显示非文本文件的内容 od -c XXX
cp 复制文件或目录 cp XXX XXX
rm 删除文件或目录 rm XXX
rm -rf 改变文件名或所在目录 rm -rf XXX
mv 回到用户根目录 mv XXX XXX
find 使用匹配表达式查找文件 find . -name “*.c” -print
file 显示文件类型 file XXX
  • 选择操作
命令名 功能描述 使用举例
head 显示文件的最初几行 head -20 XXX
tail 显示文件的最后几行 tail -15 XXX
cut 显示文件每行中的某些域 cut -f1,7 -d: /etc/passwd
colrm 从标准输入中删除若干列 colrm 8 20 XXX
diff 比较并显示两个文件的差异 diff XXX XXX
sort 排序或归并文件 sort -d -f -u XXX
uniq 去掉文件中的重复行 uniq XXX XXX
comm 显示两有序文件的公共和非公共行 comm XXX XXX
wc 统计文件的字符数、词数和行数 wc XXX
nl 给文件加上行号 nl XXX >XXX
  • 文件编辑
touch abc.txt   // 创建 abc.txt 文件
vim abc.txt     // vim编辑 abc.txt 
:wq             // vim保存并退出
:x              // vim直接退出
nano abc.txt   // nano编辑 abc.txt 
  • 将文件转成 HTML,支持格式包括 Text, .RTF, .DOC.
textutil -convert html file.extension

2.系统操作

  • 进程操作
命令名 功能描述 使用举例
ps 显示进程当前状态 ps u
kill 终止进程 kill -9 30142
  • 时间操作
命令名 功能描述 使用举例
date 显示系统的当前日期和时间 date
cal 显示日历 cal 4 2016
time 统计程序的执行时间 time a.out
  • 启动与退出
shutdown - r now      // 重启 Mac OS X
shutdown now          // 关闭 Mac OS X
  • 电源管理
pmset -g                      // 获取当前电源管理设置的信息
sudo pmset displaysleep 15    // 设置显示器无活动15分钟后关闭
sudo pmset sleep 30           // 让计算机在无活动30分钟后休眠
  • 外观
// 禁用仪表盘
defaults write com.apple.dashboard mcx-disabled -boolean YES
// 启用仪表盘
defaults write com.apple.dashboard mcx-disabled -boolean NO
  • 隐藏文件显影
// 终端输入后重启Finder即可
defaults write com.apple.finder AppleShowAllFiles -bool true // 显示
defaults write com.apple.finder AppleShowAllFiles -bool false // 隐藏
  • .DS_Store文件处理
// 禁止.DS_Store文件生成
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE 
// 恢复.DS_Store文件生成
defaults delete com.apple.desktopservices DSDontWriteNetworkStores
// 删除所有.DS_Store文件 
sudo find / -name ".DS_Store" -depth -exec rm {} \;
  • iTunes
defaults write com.apple.iTunes invertStoreLinks -bool YES  // 更改 iTunes 链接行为为本机 iTunes 库,而不是 iTunes Store
defaults write com.apple.iTunes invertStoreLinks -bool NO  // 更改 iTunes 链接行为为 iTunes Store,而不是本机 iTunes 库
  • 改变截屏图片的保存位置
defaults write com.apple.screencapture location XXX   // XXX为存放位置
  • 去掉窗口截屏的阴影
defaults write com.apple.screencapture disable-shadow -bool true
  • 强制Safari在新标签中打开网页
defaults write com.apple.Safari TargetedClicksCreateTabs -bool true

3.网络操作

  • 网络与通信操作
命令名 功能描述 使用举例
telnet 远程登录 telnet hpc.sp.net.edu.cn
rlogin 远程登录 rlogin hostname -l username
rsh 在远程主机执行指定命令 rsh f01n03 date
ftp 在本地主机与远程主机之间传输文件 ftp.sp.net.edu.cn
rcp 在本地主机与远程主机之间复制文件 rcp file1 host1:file2
mail 阅读和发送电子邮件 mail
write 给另一用户发送报文 write username pts/1
mesg 允许或拒绝接收报文 mesg n
ping 给一个网络主机发送回应请求 ping hpc.sp.net.edu.cn
  • 检测某个主机是否运行HTTP服务或网络是否可用
curl -I www.baidu.com | head -n 1
  • 使用 dig 来诊断域名信息
dig www.oschina.net A
dig www.oschina.net MX
  • 查看网络及相关信息
netstat -r        // 显示系统路由表
netstat -an       // 显示活动网络连接
netstat -s        // 显示网络统计

4.其他常用

history            // 查看终端输入历史
clear              // 清空bash输入框
  • 结束进程
killall Finder						// 重启Finder
killall Dock						// 重启Dock
defaults delete com.apple.dock		// 重置系统Dock
killall SystemUIServer				// 结束进程
  • 其他命令
命令名 功能描述 使用举例
uname 显示操作系统的有关信息 uname -a
clear 清除屏幕或窗口内容 clear
alias 给某个命令定义别名 alias del=rm -i
unalias 取消对某个别名的定义 unalias del
who 显示当前所有设置过的环境变量 who
whoami 显示当前正进行操作的用户名 whoami
tty 显示终端或伪终端的名称 tty
du 查询磁盘使用情况 du -k subdir
stty 显示或重置控制键定义 stty -a
df/tmp 显示文件系统的总空间和可用空间 -
w 显示当前系统活动的总信息 -

5.查询操作

  • find命令

unix命令,试用于OS X和Linux,格式为 find 文件路径 参数

// 在当前路径下搜索名字中包含`.md`的文件
find ~ -iname  "*.md"
// 在特定的路径下搜索特定的文件
find SilverBulletZyp.github.io/_posts "*.md"
  • mdfind命令

Spotlight功能的终端界面,若Spotlight功能被禁用,则mdfind也无法工作,mdfind命令非常高效迅速

格式为 mdfind -name 文件名字

// 搜索本地所有的.md文件
mdfind -name ".md"
// 搜索本地名为fenxiang@2x文件位置
mdfind -name fenxiang@2x
// 搜索本地所有包含该字段的文件
mdfind "正在连接聊天服务器"
// 添加-onlyin参数搜索指定目录指定文件或文件字段
mdfind -onlyin ~/company/ "正在连接聊天服务器"
mdfind -onlyin ~/company/ plist

6.安装软件打开报错

  • 检查隐私里打开任意来源

  • 终端改写隐私来源设置

sudo spctl --master-disable

7.打开Mac OSX原生的NTFS功能

  • 每次使用时输入命令
diskutil list
sudo vim /etc/fstab
  • 编辑内容
LABEL=Win\040Ntfs\040Drive none ntfs rw,auto,nobrowse
// \040代表空格
  • 保存写入
sudo ln -s /Volumes ~/Desktop/Volumes

Linux学习

众所周知,mac上的OS X与Linux系统都是类Unix系统,在使用mac进行开发时,终端命令有许多共通之处。本篇对Linux与OS X之间的区别不再概述,由于网络上提供大多为Linux学习教程,在此记录部分Linux命令,在mac上使用的可行性则自行尝试。

1.Linux命令教程汇总

2.Linux学习路线

Linux学习路线

Shell编程

1.规范

#!指向系统执行该脚本的程序

#! /bin/bash       // 脚本首行默认

默认为sh,按需要修改为bash或tcsh

shell编程规范:所有的变量都由字符串组成,并且不需要对变量进行声明

  • 赋值格式: 变量名=值
  • 首字符为字母,不可使用标点符号
  • 中间不可空格,可使用下划线
  • 不可使用关键字(help可查询shell关键字)
  • 取值: $变量名
  • 打印: echo
  • 运算符前后需有空格
  • 变量拼接时:${变量名}

以下sh下会出错

  • let 表示数学运算
  • $[] 表示将中括号内的表达式作为数学运算先计算结果再输出
  • expr 用于整数值运算,每一项用空格隔开

注:C shell只支持整数的运算 附运算符: 运算符

2.范例

1.if语句

[ -f "somefile" ]    //判断是否是一个文件
[ -x "/bin/ls" ]     //判断/bin/ls是否存在并有可执行权限
[ -n "$var" ]        // 判断$var变量是否有值
[ "$a" = "$b" ]      // 判断$a和$b是否相等

varOne=1
varTwo=2
varThree=3
if [ "$varOne" = "$varTwo" ]; then
    echo "varTwo:$varTwo"
elif [ "$varOne" = "$varThree" ]; then
    echo "varThree:$varThree"
else
    echo "varOne:$varOne"
fi

2.&&|| 操作符

varOne=1
varTwo=2
varThree=3
if [ "$varOne" = "$varThree" ] || [ "$varOne" = "$varTwo" ]; then
    echo "|| 进入"
else
    echo "No || 进入"
fi
if [ "$varOne" = "$varOne" ] && [ "$varOne" = "$varTwo" ]; then
    echo "&& 进入"
else
    echo "No && 进入"
fi

3.case语句

ftype=`file "$1"`   # Note ' and ` is different
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac

4.select语句

格式

select var in ... ; do
 break;
done

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
  break;
done
echo "You have selected $var"

5.while/for语句

varOne=1
varTwo=1
# while
while [ "$varOne" = "$varOne" ]; do
    echo "while Done"
    break
done
#  for
for varStr in H I M I ; do
    echo "varStr is $varStr"
done

3.调试

  • 打开脚本执行权限
chmod +x yourScriptName
  • 执行脚本
./yourScriptName
  • 执行脚本并显示所有变量的值
sh -x yourScriptName
  • 不执行脚本只检查语法
sh -n yourScriptName    

4.cocoapods脚本分析

实际应用:了解shell脚本编写时顺带看了iOS开发中cocoapods的脚本执行情况,项目更新pod时会跑如下脚本

diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [[ $? != 0 ]] ; then
    cat << EOM
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
EOM
    exit 1
fi

manifest.lock简单可以理解为我们在本地执行一次pod install后生成的当前Podfile的状态的表征文件。而Podfile.lock是同步他人更新过Podfile后的状态。

  • 解读

1.通过diff命令来检查Podfile.lock和Manifest.lock的区别。这个命令中的> /dev/null 可以视为一个黑洞,等价于一个只读文件,所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到。由于在执行diff命令的过程中可能产生大量的标准输出,可能会干扰我们的的工作流程执行,所以我们将它们全部丢弃给黑洞,只关心返回值。

2.if [[ $? != 0 ]] then这个命令指的上一个命令的返回值如果不等于0,就执行xxxx。其中$?也就代表着上一个命令diff的返回值。

3.如果返回值不为0,说明有差异,因此通过cat « EOM 和 EOM将处于这两者之前的内容输出到标准输出。

  • 可自行修正

如果在pod更新时并不想出现报错情况,那么我们希望,当有差异时可以自行去pod install

diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [[ $? != 0 ]] ; then
    pod install --project-directory="${PODS_ROOT}/../"
fi

mac与shell编程学习持续进行中,如理解有误请发邮件至我的邮箱。邮箱地址为在github个人主页,非常感谢!

Post Directory