bash 文件描述符
例子:
$ echo A >&3
-bash: 3: Bad file descriptor
$ echo A 3>&2 >&3|grep 8
A
第一行输出给描述符 3 相关的文件,但是没有这个文件,所以出错。
第二行把描述符 3 分配给了原先 2 的文件,然后又将输出导入到描述符 3 对应的文件中,也就是将结果输出到 stderr 中,所以 grep 8 不能拦截 echo 的输出(可以看到 A 被打印出来了)。
这种方法可以用来交换标准输入和输出流。
例子:
$ echo A >&3
-bash: 3: Bad file descriptor
$ echo A 3>&2 >&3|grep 8
A
第一行输出给描述符 3 相关的文件,但是没有这个文件,所以出错。
第二行把描述符 3 分配给了原先 2 的文件,然后又将输出导入到描述符 3 对应的文件中,也就是将结果输出到 stderr 中,所以 grep 8 不能拦截 echo 的输出(可以看到 A 被打印出来了)。
这种方法可以用来交换标准输入和输出流。
docker pull
docker pull 不会读取 http_proxy 环境变量,因为拉取请求是发给守护进程的(不清楚守护进程是否是经典的 listen-fork 模式),环境变量早就在启动时读入,需要专门配置 docker 守护进程并让它重新加载配置。可以参考: https://stackoverflow.com/a/71036185
根据 docker 官方文档 的说法,Docker Engine version 23.0 之前是需要让 daemon 启动时通过环境变量读取代理的(可以通过修改 systemctl 的 service 文件完成),现在也能通过修改 /etc/docker/daemon.json 文件来修改代理。尽管如此,我在 Docker Engine 24.0.7 上面测试,修改代理之后也需要完全重启 docker 才能让代理生效。这说明代理配置是在启动时读入,不可以运行时重载的。
如果条件允许, 使用镜像源 是比配置代理更好的选择,它支持在运行时重载。
docker build
docker build 的时候应该要用 --build-arg 传代理,然后还得大写:
docker build . --build-arg HTTP_PROXY=$http_proxy --build-arg HTTPS_PROXY=$http_proxy ...
How to show the run command of a docker container - Stack Overflow
docker inspect --format "$(curl -s \
https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" \
{your_container}
得到的结果样例:
docker run \
--name "/gitlab-runner-4" \
--runtime "runc" \
--volume "/srv/gitlab-runner/config:/etc/gitlab-runner" \
--volume "/var/run/docker.sock:/var/run/docker.sock" \
--log-driver "json-file" \
--restart "always" \
--network "bridge" \
--env "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
--detach \
"gitlab/gitlab-runner:latest" \
"run" "--user=gitlab-runner" "--working-directory=/home/gitlab-runner"
还有一种方法是使用 https://github.com/lavie/runlike 提供的 pip 包 runlike。使用起来也比较方便,但是输出的结果里面有些参数还得再检查和调整一下。
Important
要确保 runner 允许 untagged 的任务。gitlab-runner status 的确是会报错,但是不用管,对结果没有影响。
gitlab-runner 容器中的配置文件是 /etc/gitlab-runner/config.toml。
concurrent = 4
check_interval = 0
[session_server]
session_timeout = 1800
[runners]
name = "xxx"
url = "http://xxx.xxx.xxx.xxx:xxxx" # 要改成内网的,不然太慢,还受到外部服务器的 nginx 传输限制
token = "xxxxxxxx" # 要改
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "ubuntu" # default runner 其实不用改,因为 CI 任务可以指定不同的镜像
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"] # 这里做路径映射,如果需要只读,用 ro 而不是 r
shm_size = 0
gpus = "all" # 没有这个就不能运行 GPU
pull_policy = "if-not-present" # 没有这个每次都会检查镜像是否最新,对国内网络不友好
没有解决。删了也没成功。就把下载模式改成 git clone 了。
cmd 对 双引号中的 ^ 不会转义。由于单引号不是 cmd 认可的引用方式,单引号中的 ^ 会转义。
cmd 的 echo 命令并不会去掉双引号参数的双引号。例子:
C:\Users\xx>echo "6" | C:\Users\xx\scoop\shims\bash.exe -c "cat"
"6"
其他命令貌似会去掉双引号,比如 cd 和 set。外置命令就更不用说了,写 git show “HEAD” 能够正常运行,可能是因为 cmd 为非内置命令去掉了双引号。
问题:加入 pre-commit 之后,在 VS Code 的侧边栏 git 模块中提交代码看似卡住,看不到 pre-commit 的输出,也无法和 pre-commit 交互。
将下面的 entry_point 函数替换成要执行的流程,然后作为 .git/hooks/pre-commit 的内容即可。其主要作用是判断当前是否在 VS Code 环境中,如果是,则将输出写到一个临时文件中,然后再用 VS Code 打开这个文件以观察输出。解决了看不到输出、进度的问题,但是还解决不了输入的问题。
#!/bin/bash
is_inside_vscode() {
if ([[ "$TERM" == "" ]] || [[ "$TERM" == "dumb" ]]) && [[ "$PATH" == *".vscode-server/"* ]]; then
return 0
fi
return 1
}
print_header() {
echo "############################################################"
echo "# This is the temp file for showing pre-commit output. #"
echo "############################################################"
echo
}
entry_point() { :; }
if is_inside_vscode; then
tmp=$(mktemp)
code $tmp
print_header >$tmp
if ! entry_point >>$tmp 2>&1; then
echo "pre-commit failed, please check $tmp" && false
fi
else
entry_point
fi
Warning
这样的脚本并不总是有效。比如我在 2024 年 3 月 30 日 发现 .vscode-server/bin 开头的路径已经改成了 .vscode-server/cli,所以又给 PATH 检查去掉了 bin 后缀。
和 scp 相比可以断点续传。
$ rsync -avz -e ssh -r --info=progress2 --info=name0 coco/images/train2014.zip xxserver:/data/xxx/data/
2024年2月8日:这里已经是 zip 了,感觉没必要压缩。

Set -std in the .yaml file and then reload window of VS Code.
CompileFlags:
Add:
[
--std=c++17,
-Wno-documentation,
-Wno-missing-prototypes,
]
Diagnostics:
ClangTidy:
Add:
[
performance-*,
bugprone-*,
modernize-*,
clang-analyzer-*,
readability-identifier*,
]
CheckOptions:
readability-identifier-naming.VariableCase: camelCase
macOS 自带的 /usr/local/bin 中的 clang 不能提供查询路径。要么把绝对路径改成 PATH 中的命令,要么添加 "--query-driver=/usr/bin/clang++" 在参数中。
Windows 下,如果用的是 MSYS2 的编译器,需要添加:
Where do EDITOR, PAGER, BROWSER environment variables come from? - Unix & Linux Stack Exchange
EDITOR, PAGER, BROWSER 这三个环境变量控制 linux 中很多工具展示输出的方式。还有 SUDO_EDITOR 可以设置 sudoedit 使用的编辑器。
adduser 有交互过程,比 useradd 更友好。事实上,adduser 是 useradd 的 wrapper。