Mac 搭建Appium自动化测试

环境搭建目录
前提环境
python
selenium
setuptools,pip
通用环境
Homebrew
Node & NPM
Carthage
Appium
Appium Doctor
iOS 环境
Xcode
ios-deploy
ideviceinstaller & libimobiledevice
ios_webkit_debug_proxy
一、前提环境配置
安装python
下载python进行安装https://www.python.org/,默认安装,安装好之后,打开终端,输入python,如提示不是内部命令,则将python安装目录添加到环境变量Path中。

安装setuptools,pip
下载setuptools,pip https://pypi.python.org/pypi/setuptools https://pypi.python.org/pypi/pip
打开cmd 进入setuptools解压目录,输入:python setup.py install 进入pip解压目录,输入:python setup.py install 安装好后,打开终端,输入pip,如提示不是内部命令,则将python安装目录下Scripts目录添加到环境变量Path中。

安装selenium
终端输入pip install Selenium安装最新版本的selenium。
pip install Selenium 如需安装指定的版本,则pip install Selenium==版本号。
pip install Selenium==版本号

二、通用环境配置
安装 Homebrew
Homebrew是一个包管理软件,它可以使我们更容易地安装其他一些软件,终端输入安装
安装
MacBook-Air ~ % /bin/bash -c "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 卸载 MacBook-Air ~ % /usr/bin/ruby -e "(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
重新安装
MacBook-Air ~ % /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
检查homebrew是否安装
MacBook-Air ~ % brew -v
MacBook-Air ~ % brew list //查看已安装列表
MacBook-Air ~ % brew update //更新Homebrew

image.png

如果安装失败(网速不行等。。),可以打开网址:http://vip.ytesting.com/q.do?a&id=ff80808172521d8201726a74986f0880 将其内容保存为homebrew.txt,然后终端输入:
MacBook-Air ~ % /usr/bin/ruby homebrew.txt
注意:此步骤还顺带安装了Xcode命令行工具(xcode-commaindline-tools)。

安装 Node & NPM
Node是一个javascript运行时环境,npm是节点包管理器。我们需要这些,因为Appium是一个节点应用程序。在终端中,输入以下命令(此命令也将安装npm):
安装
MacBook-Air ~ % brew install node
查看node版本
MacBook-Air ~ % node -v
重新安装:
MacBook-Air ~ % brew reinstall node

image.png

image.png

默认的npm源再国内都很慢,安装好node之后需要重新配置一个国内源
MacBook-Air ~ % npm config set registry https://registry.npm.taobao.org/
MacBook-Air ~ % npm -v
image.png

image.png

安装 Carthage
Carthage是一个依赖管理器,类似于java的maven,WebDriverAgent需要它,终端输入:
安装carthage
MacBook-Air ~ % brew install carthage
更新carthage
MacBook-Air ~ % brew upgrade carthage
重新安装:
MacBook-Air ~ % brew reinstall carthage
安装完成后检查一下是否安装成功
MacBook-Air ~ % carthage version //打印出版本号即表示安装成功

image.png

如果安装 carthage出现以下错误:
Error: An unexpected error occurred during the brew link step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks
原因是carthage已经安装,但是没有 link 到 brew,还有就是文件夹权限问题,在终端输入:
MacBook-Air ~ % sudo mkdir /usr/local/Frameworks
MacBook-Air ~ % sudo chown $(whoami):admin /usr/local/Frameworks
MacBook-Air ~ % brew link carthage

安装 Appium(二选1)
Appium(Version 1.13)是一个用于本地、混合和移动web应用程序的开源测试自动化框架。它使用WebDriver协议驱动iOS、Android和Windows mobile应用程序。

方式1:安装桌面版 appium-server(推荐)
桌面版包含了appium-server,同时也包含一个元素定位器,建议安装桌面版。
进入官网下载

image.png

MacBook-Air ~ % git clone https://github.com/appium/appium-desktop.git
image.png

其他版本:进入官网下载1.17.1
image.png

方式2:安装 appium-server 版
1、安装 appium-server

终端安装server版输入:

MacBook-Air ~ % npm install -g appium

默认安装最新的版本,如果想安装指定的版本:

MacBook-Air ~ % npm install -g appium@1.7.2
卸载 Appium:
MacBook-Air ~ % npm uninstall -g appium
MacBook-Air ~ % npm cache clean --force
安装appium client
appium主站上给出的命令是npm install wd 这应该是老版本的安装方法:
MacBook-Air ~ % npm install wd # get appium client
MacBook-Air ~ % npm wd -v # 检查是否安装成功。

推荐下面的方法进行安装:

安装python-client
MacBook-Air ~ % git clone git@github.com:appium/python-client.git # 下载python-client
MacBook-Air ~ % cd python-client # 进入python-client目录
MacBook-Air ~ % python setup.py install # 安装python-client
安装成功:
Finished processing dependencies for Appium-Python-Client==0.30 # 表示安装成功,安装版本0.30

安装appium-doctor:
1、安装appium-doctor

终端运行appium-doctor检查appium安装是否成功

MacBook-Air ~ % npm install appium-doctor -g
MacBook-Air ~ % node your-appium-test.js

2、检查appium安装版本

appium doctor用来检查appium的是否成功安装。手动下载安装appium doctor的网址在:https://github.com/appium/appium-doctor

MacBook-Air ~ % appium -v # 安装完成之后输入appium -v,显示版本号表示appium server安装成功

3、启动appium服务
在终端输入appium &。输出下面的信息,则表示appium server启动成功了。
MacBook-Air ~ % appium &
[1] 965$ [Appium] Welcome to Appium v1.9.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
在终端输入:appium-doctor --ios 检查 iOS环境环境
其中的 WARN(警告)不用管:


image.png

iOS自动化 必要 环境配置没有问题

配置jdk+Android SDK 环境配置--针对Android
查看所有 必要 配置环境是否成功


image.png

image.png

打开.bash_profile
MacBook-Air ~ % open .bash_profile

Setting PATH for SDK

export ANDROID_HOME=/Users/用户名/Library/Android/sdk
export PATH=ANDROID_HOME/platform-tools:PATH
export PATH=ANDROID_HOME/tools:PATH

Setting PATH for Jdk

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home
export PATH=JAVA_HOME/bin:PATH
export CLASSPATH=.:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

关闭保存后,更新.bash_profile
MacBook-Air ~ % source .bash_profile

在终端输入:appium-doctor --Android 检查 Android环境环境


image.png

安装完成后,终端输入appium-doctor 检测环境是否成功(查询结果显示❌表示没有配置,需要配置,查看需要设置的必要环境)。
安装appium-doctor,android方面的环境需要:
必选项—— ANDROID_HOME、JAVA_HOME、adb、android、emulator
其中的警告不用管
appium-doctor # 默认安装路径:/usr/local/lib/node_modules/appium/node_modules/

IOS自动化环境配置

安装Xcode和模拟器
启动Mac应用程序商店并下载/安装Xcode(Version 13.1)。安装之后,启动Xcode并选择 Xcode > Preferences > Components 来安装可能想要测试的模拟器。


image.png

安装Command Line Tools
默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序。为了配置appium环境,我们需要安装Xcode Command Line Tools。
官网下载

image.png

下载完成后,双击已下载的 .dmg 进行安装

检验 Command Line Tools 是否安装成功

方法一:
MacBook-Air ~ % xcode-select --install # 查看是否安装
xcode-select: error: command line tools are already installed, use "Software Update" to install updates(错误:命令行工具已经安装,请使用“软件更新”安装更新)

方法二:打开Xcode,创建一个新的项目,在OSX下面选择Application,如果右侧出现Command line tool图标,表示已经安装成功。


image.png

方法三:打开XCode 新建工程,如果安装了,在新建窗口可以看到

image.png

安装完成后,在终端中输入以下命令来查看安装版本:
MacBook-Air ~ % xcodebuild -version
Xcode 11.6
如果已经安装过xcode,appium-doctor提示未安装,则运行命令即可:
MacBook-Air ~ % sudo xcode-select -r
Tips:

查看已启动的模拟器udid

xcrun simctl list | grep '(Booted)'

列出所有设备,包括真机、模拟器、mac

instruments -s devices

录像功能

xrecord --quicktime --list
xrecord --quicktime --name="iPhone" --out="/Users/blah/video/iphone.mp4" --force

安装 libimobiledevice & ideviceinstaller
libimobiledevice 是一个跨平台的软件库,支持 iPhone®, iPod Touch®, iPad® and Apple TV® 等设备的通讯协议。不依赖任何已有的私有库,不需要越狱。应用软件可以通过这个开发包轻松访问设备的文件系统、获取设备信息,备份和恢复设备,管理 SpringBoard 图标,管理已安装应用,获取通讯录、日程、备注和书签等信息,使用 libgpod 同步音乐和视频。 ideviceinstaller 是一个与iOS设备的installation_proxy交互的工具,允许安装、升级、卸载、存档、还原和列举已安装或存档的app。此工具用于在真机上运行测试,默认是都安装的。
MacBook-Air ~ % brew install libimobiledevice --HEAD # 安装最新的更新
MacBook-Air ~ % brew reinstall libimobiledevice # 重新安装
MacBook-Air ~ % brew install ideviceinstaller # 用于查看bundleid
MacBook-Air ~ % brew reinstall ideviceinstaller # 重新安装
如果安装时遇到: “invalid active developer path” 则运行:
MacBook-Air ~ % xcode-select --install
MacBook-Air ~ % sudo xcode-select -r
可能出现的问题
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib Referenced from:
/usr/local/opt/libimobiledevice/lib/libimobiledevice.6.dylib Reason: image not found
如果遇到如上错误,则先卸载ideviceinstaller 和 libimobiledevice
MacBook-Air ~ % brew uninstall ideviceinstaller
MacBook-Air ~ % brew uninstall libimobiledevice
然后再重安装即可

安装 ios-deploy
ios-deploy 同样是一个不需要用Xcode安装和调试应用的命令行工具。需要一个有效的开发者证书,需要 Xcode 7以上的版本。终端输入命令进行安装:
MacBook-Air ~ % brew install ios-deploy # 安装命令
MacBook-Air ~ % brew reinstall ios-deploy # 重新安装
MacBook-Air ~ % brew upgrade ios-deploy # 更新命令

image.png

安装 ios_webkit_debug_proxy
Appium使用ios_webkit_debug_proxy这个工具在真机上访问web view。在终端中,运行以下命令:
MacBook-Air ~ % brew install ios-webkit-debug-proxy # 安装命令
MacBook-Air ~ % brew reinstall ios-webkit-debug-proxy # 重新安装
至此iOS环境搭建完毕!!!只适用于模拟器,真机的话还需要配置。

iOS真机调试环境配置
编译webagentrunner项目,安装到被测真实设备上
查看appium的安装位置,正常npm安装的位置应该在/usr/local/bin/appium下
MacBook-Air ~ % which appium

/usr/local/bin/appium (命令版安装)

命令行安装的appium一般安装在/usr/local/bin/appium下,WebDriverAgent将会在路径:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/ 下;如果是桌面版的,WebDriverAgent的路径是:ls /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

命令行版

MacBook-Air ~ % cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

桌面版

MacBook-Air ~ % cd /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent


image.png

首先查看路径(/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent)下有没有WebDriverAgent.xcodeproj(有的话跳过下边,直接用Xcode打开即可)

image.png

2)如果/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent 没有WebDriverAgent.xcodeproj存在,则打开终端运行如下命令搭建项目:
MacBook-Air ~ % cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/
MacBook-Air ~ % mkdir -p Resources/WebDriverAgent.bundle
MacBook-Air ~ % ./Scripts/bootstrap.sh -d
然后用Xcode 打开 WebDriverAgent.xcodeproj,在 “Signing&Capabilities” 下将 WebDriverAgentLibWebDriverAgentRunner设置成 “Automatically manage signing” 并在 “Team” 中选择你的开发团队 ;
image.png

image.png

新用户第一次需要创建Team团队

image.png

image.png

image.png
image.png
image.png

个人证书调试失败
Failed to register bundle identifier.
The app identifier "com.facebook.WebDriverAgentRunner" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.

需要手动更改目标的bundle id,方法是进入“Build Settings”选项,更改“Product bundle Identifier”的值使Xcode将接受,默认为com.facebook.WebDriverAgentRunner,你需要改成不一样的,如:io.automation.WebDriverAgentRunner

image.png

返回 “Signing&Capabilities” 选项,看到对于文件WebDriverAgentRunner的配置文件已经创建成功了
image.png

image.png

解决⚠️问题


image.png

真机测试
最后,build项目: 通过Xcode获取udid:
利用ios-deploy获取,其他参考上边的介绍
MacBook-Air ~ % ios-deploy -c


image.png

命令行进入到WDA项目目录
MacBook-Air ~ % cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent

将WDA安装到被测手机上,并测试该应用
MacBook-Air ~ % xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=<测试机的udid>' test


image.png

报错:
error: No profiles for 'io.uitest.WebDriverAgentRunner.xctrunner' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'io.uitest.WebDriverAgentRunner.xctrunner'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'WebDriverAgentRunner' from project 'WebDriverAgent')报这个错是因为没有接入相关的设备到MAC上,只要设备接入,并通过XCode菜单:Product->Destnation->"Select Devices"选中要连接的设备就行。

XCode:
Product->Destination->"Select your iphone"


image.png

Product->Scheme->"Select WebDriverAgentRunner"


image.png

Product -> Test
image.png

注意:运行Test之前,手机先解锁再通过USB线连接到电脑。

运行完"Test",如果遇到这个报错:

运行报错:


image.png

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj User-supplied CFBundleIdentifier value 'com.facebook.wda.lib' in the Info.plist must be the same as the PRODUCT_BUNDLE_IDENTIFIER build setting value 'com.facebook.WebDriverAgentLib'.
解决方案:


image.png

运行报错:


image.png

/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h:16:9: 'CocoaAsyncSocket/GCDAsyncSocket.h' file not found
解决:进入appium-webdriveragent目录,重新执行:
MacBook-Air % cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
MacBook-Air appium-webdriveragent % sh ./Scripts/bootstrap.sh


image.png

再次执行Product -> Test,弹出密钥授权弹窗,输入密钥(多次输入密钥,直到弹窗消失)


image.png

image.png

最后报错:Command CodeSign failed with a nonzero exit code
解决方案---通过终端命令:MacBook-Air appium-webdriveragent % xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=000-000080E' test
执行中会弹出密钥弹窗,多次输入密钥,直到弹窗消失


image.png

最后机上可以看到一个没有图标的 WebDriverAgentRunner.app 应用,进入设置 -》通用 -》设备管理 -》点击 开发者app下面的证书 -》点击“第一个蓝色字体信任按钮” -》点击信任,再重新执行项目即可正常连接
xcode点击▶️直接运行:


image.png

再次报错:
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj User-supplied CFBundleIdentifier value 'com.facebook.wda.runner' in the Info.plist must be the same as the PRODUCT_BUNDLE_IDENTIFIER build setting value 'io.uitest.WebDriverAgentRunner'.
解决方案:


image.png

最终看到这样输出就是成功了:
Test Suite ‘All tests’ started at 2017-01-23 15:49:12.585
Test Suite ‘WebDriverAgentRunner.xctest’ started at 2017-01-23 15:49:12.586
Test Suite ‘UITestingUITests’ started at 2017-01-23 15:49:12.587
Test Case ‘-[UITestingUITests testRunner]’ started.
t = 0.00s Start Test at 2017-01-23 15:49:12.588
t = 0.00s Set Up

验证是否安装成功,确保手机和电脑连接同一个WiFi(同一局域网内),可以不设置这些内容:
export DEVICE_URL='http://<device IP>:8100'
export JSON_HEADER='-H "Content-Type: application/json;charset=UTF-8, accept: application/json"'
curl -X GET JSON_HEADERDEVICE_URL/status

直接在手机浏览器中输入这个地址http://127.0.0.1:8100/status返回一个json串即表明连接成功

image.png

安装成功后运行如果遇到这样的错误:
2017-01-24 09:02:18.358 xcodebuild[30385:339674] Error Domain=com.apple.platform.iphoneos Code=-12 "Unable to launch com.apple.test.WebDriverAgentRunner-Runner" UserInfo={NSLocalizedDescription=Unable to launch com.apple.test.WebDriverAgentRunner-Runner, NSUnderlyingError=0x7fa839cadc60 {Error Domain=DTXMessage Code=1 "(null)" UserInfo={DTXExceptionKey=The operation couldn’t be completed. Unable to launch com.apple.test.WebDriverAgentRunner-Runner because it has an invalid code signature, inadequate entitlements or its profile has not been explicitly trusted by the user. : Failed to launch process with bundle identifier 'com.apple.test.WebDriverAgentRunner-Runner'}}}
2017-01-24 09:02:18.358 xcodebuild[30385:339674] Error Domain=IDETestOperationsObserverErrorDomain Code=5 "Early unexpected exit, operation never finished bootstrapping - no restart will be attempted" UserInfo={NSLocalizedDescription=Early unexpected exit, operation never finished bootstrapping - no restart will be attempted}
Testing failed:
Test target WebDriverAgentRunner encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted)
至此iOS真机运行环境mac端配置完毕

手机端设置
进入设置,开发者选项,允许UIautomator
Tips: 真机运行务必添加这两个参数到capabilities:
{
#xcodeOrgId 类似:TEST INTERNATIONAL

"xcodeOrgId": "<Team ID>",

#xcodeSigningId 是一个由Apple生成的唯一的10个字符的字符串,类似 6387P24J3L

"xcodeSigningId": "iPhone Developer"
}

这两个字段获取方式:
xcodeOrgId: 开发者组织代码,是一串唯一的10位随机字符串。查找方式:打开keychain,找到苹果开发者对应的证书,点进去,找到Organizational Unit这项,对应的字符串就是了
xcodeSigningId:直接填 iPhone Developer

真机手动配置补充
udid就是设备唯一识别码了,查看方式参考上文,如果只连接了一台设备可以设置为auto
理想情况下,appium会自动注册并编译,但是如果有出现编译失败报错误码65的现象一般是由于找不到指定的开发者证书,需要我们手动配置一下,配置之后再手动编译一次,下次再运行的时候基本就可以了
第一次在手机构建webdriveragent应用时,xcode需要访问keychain以获取证书,输入当前mac用户的登录密码,然后点击 allow all 即可,如果连续弹出多次对话框就多次点击 allow all

附录

ios-deploy使用命令参考
安装应用
ios-deploy -c # 查看当前链接的设备,获取udid

xxx.app为 Xcode 编译后的应用安装包路径

ios-deploy --id [udid] --bundle [xxx.app] # 给指定设备安装应用,udid是苹果设备唯一识别码
卸载应用
ios-deploy --id [udid] --uninstall_only --bundle_id [bundleId] # 给指定连接的设备卸载应用
查看设备已安装的应用
ios-deploy --id [udid] --list_bundle_id # 查看设备安装的所有应用,包括系统应用和第三方应用
ios-deploy --id [udid] --exists --bundle_id # 指定设备检查指定应用是否已经安装

idevice命令用法参考
获取设备的udid的几种方法
idevice_id --list # 略写为 -l 显示当前所连接设备的 udid
idevice_id -l # 显示当前所连接的设备[udid],包括 usb、WiFi 连接
instruments -s devices # 列出设备包括模拟器、真机及 mac 电脑本身
ideviceinfo # 可以在返回的数据中找到 udid

另外苹果手机 safari打开网址http://fir.im/udid 就看到了

安装应用

xxx.ipa为应用在本地的路径

ideviceinstaller -i apppath # 安装apppath下的app
ideviceinstaller -u [udid] -i [xxx.ipa] # 给指定连接的设备安装应用
卸载应用
bundleId为应用的包名
ideviceinstaller -u [udid] -U [bundleId] # 给指定连接的设备卸载应用
查看设备已安装的应用
ideviceinstaller -l #列出手机上所有用户安装的app
运行某个app
idevicedebug run 'APP_BUNDLE_ID' # 可以直接launch某个app,当然,这个app必须是你通过development证书build到手机上的才行
ideviceinstaller -u [udid] -l # 指定设备,查看安装的第三方应用
ideviceinstaller -u [udid] -l -o list_user # 指定设备,查看安装的第三方应用
ideviceinstaller -u [udid] -l -o list_system # 指定设备,查看安装的系统应用
ideviceinstaller -u [udid] -l -o list_all # 指定设备,查看安装的系统应用和第三方应用
获取设备信息
ideviceinfo -u [udid] # 指定设备,获取设备信息
ideviceinfo -u [udid] -k DeviceName # 指定设备,获取设备名称:iPhone6s
idevicename -u [udid] # 指定设备,获取设备名称:iPhone6s
ideviceinfo -u [udid] -k ProductVersion # 指定设备,获取设备版本:10.3.1
ideviceinfo -u [udid] -k ProductType # 指定设备,获取设备类型:iPhone8,1
ideviceinfo -u [udid] -k ProductName # 指定设备,获取设备系统名称:iPhone OS
其他系统文件信息
idevicescreenshot # 截图
ideviceinfo # 获取设备所有信息
idevicesyslog # 获取设备日志
idevicecrashreport -e test # 获取设备 crashlog,test 是文件夹需新建
idevicediagnostics restart # (shutdown、sleep)管理设备状态 - 重启、关机、睡眠等

安装 JDK(android自动化)
下载 Java jdk ,按步骤安装,安装完成后需要在.bash_profile设置 JAVA_HOME ,设置之前你可以通过下边的命令查看Java的安装路径,terminal输入:
/usr/libexec/java_home --v
输出路径:
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
通过vim 编辑.bash_profile文件,终端输入:
vim ~/.bash_profile
按 i键进入编辑模式,移动到最下边加入如下两行(路径为之前查看的):
[改为你自己的java_home路径]
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
export PATH=JAVA_HOME/bin:PATH
添加后按 Esc按键,输入:wq保存并退出编辑。输入使其生效(或重启终端):
添加后按 Esc按键,输入:wq保存并退出编辑。输入使其生效(或重启终端):
source ~/.bash_profile

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274