我试图获取OS X上当前运行脚本的绝对路径.
我看到很多回复readlink -f $0
.但是,由于OS X readlink
与BSD相同,它只是不起作用(它适用于GNU的版本).
有没有开箱即用的解决方案?
Ole*_*eev 104
这三个简单的步骤将解决这个问题以及许多其他OS X问题:
brew install coreutils
grealpath .
(3)可以改为just realpath
,见(2)输出
Joh*_*ica 76
有一个realpath()
C函数可以完成这项工作,但我没有在命令行上看到任何可用的东西.这是一个快速而又脏的替代品:
#!/bin/bash
realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
realpath "$0"
Run Code Online (Sandbox Code Playgroud)
如果它以a开头,则逐字打印路径/
.如果不是它必须是相对路径,所以它$PWD
在前面.的#./
部分剥去./
从的前面$1
.
Geo*_*xon 24
啊.我发现之前的答案有点缺乏原因:特别是,它们没有解决多级符号链接,而且它们非常"Bash-y".虽然最初的问题明确要求"Bash脚本",但它也提到了Mac OS X的类BSD,非GNU readlink
.所以这是尝试一些合理的可移植性(我用bash检查它为'sh'和破折号),解析任意数量的符号链接; 它也应该与路径中的空格一起使用,虽然我不确定该实用程序本身的基本名称是否有空格,所以也许,嗯,避免这种情况?
#!/bin/sh
realpath() {
OURPWD=$PWD
cd "$(dirname "$1")"
LINK=$(readlink "$(basename "$1")")
while [ "$LINK" ]; do
cd "$(dirname "$LINK")"
LINK=$(readlink "$(basename "$1")")
done
REALPATH="$PWD/$(basename "$1")"
cd "$OURPWD"
echo "$REALPATH"
}
realpath "$@"
Run Code Online (Sandbox Code Playgroud)
希望对某人有用.
xpt*_*xpt 15
我检查了每个答案,但错过了 Jason S 于 2016 年 7 月 14 日 3:12 发表的最好的一个(恕我直言),离开了评论字段。
所以,如果像我这样的人倾向于检查答案,但没有时间仔细查看每一条评论:
$( cd "$(dirname "$0")" ; pwd -P )
Run Code Online (Sandbox Code Playgroud)
帮助:
NAME
pwd -- return working directory name
SYNOPSIS
pwd [-L | -P]
DESCRIPTION
The pwd utility writes the absolute pathname of the current working
directory to the standard output.
Some shells may provide a builtin pwd command which is similar or identi-
cal to this utility. Consult the builtin(1) manual page.
The options are as follows:
-L Display the logical current working directory.
-P Display the physical current working directory (all symbolic
links resolved).
Run Code Online (Sandbox Code Playgroud)
小智 11
Python解决方案的更多命令行友好变体:
python -c "import os; print(os.path.realpath('$1'))"
Run Code Online (Sandbox Code Playgroud)
使用Python来获取它:
#!/usr/bin/env python
import os
import sys
print(os.path.realpath(sys.argv[1]))
Run Code Online (Sandbox Code Playgroud)
我一直在寻找在系统配置脚本中使用的解决方案,即在安装Homebrew之前运行.缺乏正确的解决方案我只是将任务卸载到跨平台语言,例如Perl:
script_abspath=$(perl -e 'use Cwd "abs_path"; print abs_path(@ARGV[0])' -- "$0")
Run Code Online (Sandbox Code Playgroud)
更常见的是我们真正想要的是包含目录:
here=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")
Run Code Online (Sandbox Code Playgroud)
abs_path () {
echo "$(cd $(dirname "$1");pwd)/$(basename "$1")"
}
Run Code Online (Sandbox Code Playgroud)
dirname
将给出 的目录名称/path/to/file
,即/path/to
。
cd /path/to; pwd
确保路径是绝对的。
basename
将只给出文件名/path/to/file
,即file
.
因为有其他人指出的真实路径:
// realpath.c
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[])
{
if (argc > 1) {
for (int argIter = 1; argIter < argc; ++argIter) {
char *resolved_path_buffer = NULL;
char *result = realpath(argv[argIter], resolved_path_buffer);
puts(result);
if (result != NULL) {
free(result);
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Makefile文件:
#Makefile
OBJ = realpath.o
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS)
realpath: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
Run Code Online (Sandbox Code Playgroud)
然后编译make
并输入一个软链接:
ln -s $(pwd)/realpath /usr/local/bin/realpath
Mac OS X 的真实路径
realpath() {
path=`eval echo "$1"`
folder=$(dirname "$path")
echo $(cd "$folder"; pwd)/$(basename "$path");
}
Run Code Online (Sandbox Code Playgroud)
具有相关路径的示例:
realpath "../scripts/test.sh"
Run Code Online (Sandbox Code Playgroud)
主文件夹示例
realpath "~/Test/../Test/scripts/test.sh"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
61439 次 |
最近记录: |