$ ./ 应用
-
92 如果存在任何解决方案,则当前的解决方案都不起作用 目录名末尾的换行 -他们将被命令替换掉。 要解决这个问题,可以在命令替换中附加一个非换行字符- DIR=“$(cd”$(目录名“${BASH_SOURCE[0]}”)“&&pwd&&echo x)” -并在不替换命令的情况下删除它- DIR=“${DIR%x}” . – 10亿 评论 2012年9月24日12:15 -
97 @jpmc26有两种非常常见的情况:事故和破坏。 脚本不应该仅仅因为某人在某处执行了 mkdir$“\n” . – 10亿 评论 2013年3月28日8:14 -
38 任何让人们以这种方式破坏他们的系统的人都不应该让它去检测这样的问题。。。 更不用说雇佣有能力犯这种错误的人了。 在使用bash的25年中,我从未见过这种事情在任何地方发生。。。。 这就是为什么我们有像perl这样的东西和像污点检查这样的实践(我可能会因为这样说而感到愤怒:) – 奥西里斯哥特拉 评论 2015年2月5日0:12 -
86 我强烈建议读这篇文章 Bash常见问题 关于主题。 – 拉尼·阿尔贝格·温 评论 2016年1月30日2:22 -
@osirisgothra任何认为解决文件名中危险字符的方法不是编写健壮的脚本,而是阻止人们(可能在某些时候创建危险名称)访问系统的人都会遇到困难。 – 街童 评论 5月3日4:15
77个答案
script_path=$(目录名“$(readlink-f”$0“)”)“/” echo“$script_path”
/主页/用户名/桌面/
函数getScriptAbsoluteDir{#fold>> #@description用于获取脚本路径 #@param$1脚本$0参数 本地script_invoke_path=“$1” local cwd=`pwd` #绝对路径? 如果是,第一个字符是/ 如果测试“x${script_invoke_path:0:1}”='x/' 然后 结果=`dirname“$script_invoke_path”` 其他的 结果=`dirname“$cwd/$script_invoke_path”` fi(菲涅耳) }#<<折叠
-
对不起,我有点像bash scrip noob,我只需键入即可调用此函数吗 获取脚本绝对目录 或 local currdir='getScriptAbsoluteDir' ? – 加亚罗 评论 2009年11月30日16:04 -
4 -1: 功能 关键字在POSIX shell上不可用,它是一个不必要的不兼容bash/ksh/&c扩展。 此外,如果您使用的shell足够新,可以使用该扩展,则不需要测试“x[…]”。 – 查尔斯·达菲 评论 2014年6月9日3:41 -
这看起来像Python。。。 我似乎记不得我曾经在shell脚本中使用过“local”关键字。。。 按照查尔斯的说法 如果[[“${script_invoke_path:0:1}”==“/”]]; 然后 等等。注意逻辑双精度 == “等于”运算符。 – 语法错误 评论 2014年9月9日23:31
IFS=读取-rd''DIR<<([[$BASH_SOURCE!=*/*]]||cd“${BASH_SURCE%/*}/”>&&echo-n“$PWD”)
#!/ 垃圾桶/垃圾桶-- cd“$(目录名”${0}“)”/.|| 出口2
$1ls(美元) 应用 $mkdir“$(打印文件“\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\40\41\42\43\44\46\47testdir”“”)” $mv应用程序*测试目录 $ln-s*testdir“$(打印f”\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\41\42\43\44\45\46\47符号链接“”)” $ls-磅 总共4个 lrwxrwxrwx 1 jay stacko 46 3月30日20:44\001\002\003\004\005\006\a\b\t\n\v\f\r\n016\017\0022\022\ 023\024\025\026\027\030\031\032\034\035\036\037\! “#$%&'symlink->\001\002\003\004\005\006\a\b\t\n\v\f\r\n016\017\020\022\023\024\025\026\027\030\031\032\034\035\036\037\!”#$%&'testdir drwxr-xr-x 2 jay stacko 4096 3月30日20:44\001\002\003\004\005\006\a\t\n\v\f\r\n016\017\020\022\023\024\026\027\030\031\033\035\036\037\! “#$%&'测试目录 $*testdir/application&&printf“成功” 成功 $*symlink/application&&printf“成功” 成功
函数get_realpath(){ 如果[[-f“$1”]] 然后 #文件*必须*存在 如果cd“$(echo“${1%/*}”)”&>/dev/null 然后 #文件*可能*不是本地文件。 #例外情况是/ 文件.ext #t试用光盘。; cd-;'* 奏效了* local tmppwd=“$PWD” cd->/dev/null 其他的 #文件*必须*为本地文件 local tmppwd=“$PWD” fi(菲涅耳) 其他的 #文件*不能*存在 return 1#失败 fi(菲涅耳) #重新组装realpath echo“$tmppwd”/“${1#*/}” return 0#成功 } 函数get_dername(){ local realpath=“$(get_realpath”$1“)” if(($?))#非零时为True。 然后 返回$?# 失败 fi(菲涅耳) echo“${realpath%/*}” return 0#成功 } #然后从顶层开始: get_dirname”/ script.sh’ #或在脚本中: get_dirname“$0” #甚至可以测试结果! if(($?))#非零时为True。 然后 退出1#失败 fi(菲涅耳)
源“/path/to/realpath-lib” get_dirname“$0” if(($?))#非零时为True。 然后 退出1#失败 fi(菲涅耳)
#!/ 垃圾桶/桶 ( 路径=“${0}” 测试时-n“${path}”; 做 #确保我们至少有一个斜线,没有前导破折号。 expr“${path}”:/>/dev/null|path=“./${path2}” #过滤掉路径名中的错误字符。 expr“${path}”:“.*[*?<>\\]”>/dev/null&&exit 1 #捕获嵌入的新行和不存在的(或与路径相关的)文件。 #通过“#!”调用脚本时,$0应始终是绝对值。 test“`ls-l-d”${path}“2>/dev/null|wc-l`”-eq 1||exit 1 #更改为包含文件的文件夹以解析相对链接。 文件夹=`expr“${path}”:“\(.*/\)[^/][^/]*/*$”`||退出1 路径=`expr“x\`ls-l-d”${path}“\`”:“[^>]*->\(.*\)”` cd“${文件夹}” #如果最后一个路径不是链接,则我们位于目标文件夹中。 测试-n“${path}”|pwd 完成 )
#!/ 垃圾桶/垃圾桶 x=`哪个“${0}”` echo basename=`basename“${x}”` echo dirname=`dirname“${x}”` 回波电流pwd=`pwd`
$ls-alFd~/p*
drwxr-xr-x 1无0'/home/Asus/path with space'/
$pwd(加元) /主页/华硕 $bash~/path\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前密码=/home/Asus $~/path\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前密码=/home/Asus $ ./ 路径\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前密码=/home/Asus $巴什/ 路径\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前密码=/home/Asus 美元cd/tmp $bash~/path\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前pwd=/tmp $~/path\ with\space/test.sh basename=测试.sh dirname=/home/Asus/path,带空格 当前pwd=/tmp
#!/ 垃圾桶/桶 #获取poem.txt文件的绝对路径。 POEM=“$PWD/../poement.txt” #获取脚本文件的绝对路径。 SCRIPT=“$(其中$0)” 如果[“x$(echo$SCRIPT|grep'^\/')”=“x”]; 然后 SCRIPT=“$PWD/$SCRIPT” fi(菲涅耳)
##基础大脑-了解你来自哪里,你是谁。 我的=$$ ORIGINAL_DIR=“$(pwd)”#这不是热气球之旅。。 fa=“$0”#第一假设 ta=#临时假设 wa=#加权假设 虽然是真的; 做 [“${fa:0:1}”=“/”]&&wa=$0&&break [“${fa:0:2}”=“./”]&&ta=“${ORIGINAL_DIR}/${fa:2}“&&[-e”$ta“]&wa=“$ta”&&break ta=“${ORIGINAL_DIR}/${fa}”&&[-e“$ta”]&wa=“$ta“&&break 完成 SW=“$wa” SWDIR=“$(目录名”$wa“)” SWBIN=“$(basename”$wa“)” 未设置ta fa wa ([!-e“$SWDIR/$SWBIN”]||[-z“$SW”])&&echo“我找不到路:(TOP脚本中可能存在的错误”&&exit 1
函数include() { 如果[[-n“$CURRENT_SCRIPT_DIR”]]; 然后 本地目录路径=。。。 从`CURRENT_SCRIPT_DIR/$1`获取目录,取决于$1是绝对路径还是相对路径。。。 local include_file_path=。。。 其他的 本地目录路径=。。。 使用此处应答的方法之一从“$1”参数请求目录。。。 local include_file_path=。。。 fi(菲涅耳) …正在将$CURRENT_SCRIPT_DIR推入堆栈。。。 export CURRENT_SCRIPT_DIR=。。。 使用$dir_path导出当前脚本目录。。。 源“$include_file_path” …从堆栈中弹出$CURRENT_SCRIPT_DIR。。。 }
export SOURCE_DIRECTORY=“$(php-r'echo目录名(realpath($argv[1]));'”--“${BASH_SOURCE[0]}”)“