如何用“〜”代替回家的路?

How to substitute path to home for "~"?

如果我从命令行传入路径,“~”会扩展到我的主目录:

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (doseq [arg args]
    (println arg)))

britannia:uberjar srseverance$ java -jar args-0.1.0-SNAPSHOT-standalone.jar ~/158.clj 
/Volumes/Macintosh HD/Users/srseverance/158.clj

但是如果我尝试使用包含 ~ 的路径文件,我找不到该文件。

user> (with-open [r (clojure.java.io/reader "~/158.clj")]
        (doall (line-seq r)))
FileNotFoundException ~/158.clj (No such file or directory)  java.io.FileInputStream.open0 (FileInputStream.java:-2)

如何使用“~/158.clj”之类的字符串并取回 clojure.java.io/reader 可以使用的内容,例如“/Volumes/Macintosh HD/Users/srseverance/158.clj” ?

你可以定义

(defn expand-home [s]
  (if (.startsWith s "~")
    (clojure.string/replace-first s "~" (System/getProperty "user.home"))
    s))

并用它来解析主目录:

(clojure.java.io/reader (expand-home "~/158.clj"))]

您还可以查看 fs library definition of expand-home

根据 bfontaine 的评论,我们可以通过询问系统来获得 ~user~root 的正确结果:

(require '[clojure.java.shell :refer [sh]])

(defn bash [command]
  (sh "bash" "-c" command))

(defn expand [path]
  (-> (str "echo -n " path)
      bash
      :out))

(expand "~")
;; => /home/teodorlu

(expand "~teodorlu")
;; => /home/teodorlu

(expand "~root")
;; => /root

但是,仅将此用于受信任的代码!

(expand "`cat ~/.passwords`")
;; => All my passwords!