能否独立使用Nix语言完成简单Shell脚本编写?
用Nix编写简单脚本(个人使用场景)
当然可以,Nix语言完全支持独立编写这类日常脚本,满足调用编译器、文件复制移动这类需求,个人用完全没问题——只要你装了Nix环境就行。
1. 调用外部命令行工具(比如编译器)
Nix可以直接调用系统或Nix包管理中的命令行工具,两种常见方式:
方式一:用内置execve直接调用
比如写个编译C文件的脚本compile.nix:
let # 从Nixpkgs获取gcc gcc = import <nixpkgs> {}.gcc; in # 执行gcc命令,参数列表和环境变量按需设置 builtins.execve "${gcc}/bin/gcc" [ "gcc" "-o" "hello" "hello.c" ] {}
运行命令:
nix-instantiate --eval --execute compile.nix
方式二:用runCommand封装Shell命令
如果习惯Shell语法,也可以用runCommand直接写Shell片段:
let pkgs = import <nixpkgs> {}; in pkgs.runCommand "compile-hello" {} '' gcc -o hello hello.c # 这里可以加更多Shell命令,比如运行生成的程序 ./hello ''
运行时如果不想受Nix沙箱限制(个人用没必要),加个参数:
nix-instantiate --eval --execute --option sandbox false compile.nix
2. 文件复制与移动操作
Nix内置了专门的文件操作函数,不用依赖Shell命令:
写个file-ops.nix脚本:
# 检查源文件是否存在 if builtins.pathExists "./source.txt" then ( # 复制文件 builtins.copyFile "./source.txt" "./dest.txt"; # 创建目标目录(如果不存在) builtins.createDirectory "./my-files"; # 移动文件到目标目录 builtins.moveTo "./my-files" "./dest.txt"; ) else builtins.trace "源文件不存在!" null
运行命令:
nix-instantiate --eval --execute file-ops.nix
额外提示
个人使用时不用严格遵循Nix的纯函数式约束,灵活组合内置函数和外部命令就行。而且Nix把文件路径作为一等公民,处理路径拼接、存在性检查这类操作比Shell更直观可靠。
内容的提问来源于stack exchange,提问作者devdanke
相关产品推荐
相关产品推荐

