Cygwin 中使用Miniconda
前奏(换行符在不同系统上的区别)
这里讲的是Windows系统下和 Linux系统下换行符的差别。
可直接跳转至末尾查看解决方法…
-
此时两个文本文件必然为空(0字节):# 新建两个文本文件windows.txt和linux.txt $ >windows.txt $ >linux.txt
$ ls -l *.txt -rw-r--r-- 1 jayxin None 0 Apr 13 15:54 linux.txt -rwxr-xr-x 1 jayxin None 0 Apr 13 15:54 windows.txt
-
# 分别通过vim和notepad在文件中键入Enter $ notepad windows.txt # 键入Enter后保存并关闭 $ vim linux.txt # 进入插入模式并键入Enter保存后退出 # vim 要确保文件编辑格式是unix的 # 使用set fileformat=unix更改 # set ff? 查看当前文件格式 $ ls -l *.txt -rw-r--r-- 1 jayxin None 2 Apr 13 16:02 linux.txt -rwxr-xr-x 1 jayxin None 2 Apr 13 16:01 windows.txt # 这里我们发现两个文件的大小都是2字节 # 那这两个文件里到底有什么? # 通过cat的-A选项显示非打印字符 $ cat -A windows.txt ^M$ $ cat -A linux.txt $ $ # 输入的是Enter,为什么变成^M和$? # 通过使用echo命令一探究竟 # echo 的 -e 选项表示启用转义 # echo 输出完毕后会自动添加换行,可用-n选项取消 # 具体可见 help echo $ echo -en "\n" | cat -A - $ $ echo -en "\r" | cat -A - ^M # 现在我们就知道cat的输出中: # \n 对应 $ # \r 对应 ^M # 所以windows.txt中的内容: \r\n # linux.txt: \n\n # 接下来我们在多输入一个Enter试试 $ cat -A windows.txt ^M$ ^M$ $ cat -A linux.txt $ $ $ # 其实使用vim进行编辑 # 只要有内容那么最后一个一定是$ $ vim test.txt # 输入空格不按回车我们也能发现最后一个是$ $ cat -A test.txt # 所以实际上vim中键入Enter是对应一个$ # 最后一个$是自动添加的
接下来就总结一下:
- Windows中键入
Enter
对应的是\r\n
. - Linux中键入
Enter
对应的是\n
.
使用Miniconda虚拟环境
先要配置环境变量:
D:\programs\miniconda38
D:\programs\miniconda38\Scripts
D:\programs\miniconda38\Library\bin
输入conda activate env_name
发现需要conda init
;
conda init
后发现还是不行.
后来发现一种方法就是source activate
.
结果:
$ source activate
/etc/profile.d/conda.sh: No such file or directory
: numeric argument required
系统提示找不到;
$ file $(which activate)
/cygdrive/d/programs/miniconda38/Scripts/activate: POSIX shell script, ASCII text executable,
with CRLF line terminators
# CRLF? --> windows下的换行符
# 而我们是要通过bash执行.sh文件
# carriage return
# line feed
$ cat -A $(which activate)
#!/bin/sh^M$
_CONDA_ROOT="D:\programs\miniconda38"^M$
# Copyright (C) 2012 Anaconda, Inc^M$
# SPDX-License-Identifier: BSD-3-Clause^M$
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?^M$
conda activate "$@"^M$
和 source activate
对比一下发现_CONDA_ROOT
变量并没有被加载.
下面是一个简单的例子:
#!/bin/bash
# 这个文件应该用notepad编辑
# 或使用vim的dos模式
a="haha"
echo "$a/shit"
执行上面的例子后发现只输出了/shit
.
所以一切的一切都是这个CRLF
惹的祸.
导致找不到文件路径?
如何解决
我用的是这种方法:
在.bashrc
文件中添加这么一行代码: set -o igncr
.即忽略CR
.
最后source .bashrc
-> source activate
-> conda activate env_name
.
之前看那些书上说Windows和Unix中换行符的表示是不同的,现在遇到麻烦才真正理解它讲的是什么玩意儿?
看来还是得多实践,不要只关注书里那点儿浅薄的东西!
纸上得来终觉浅,绝知此事要躬行。