Linux 试图从不同位置运行shell脚本,但错误显示为I';我正试图创建一个目录
我正在尝试运行以下脚本,让我们从工作目录以外的其他位置调用它Linux 试图从不同位置运行shell脚本,但错误显示为I';我正试图创建一个目录,linux,bash,shell,Linux,Bash,Shell,我正在尝试运行以下脚本,让我们从工作目录以外的其他位置调用它foo.sh: var1="$1" var2="$2" for SNR_NR in $var1; do for parts in $var2; do # echo *-$SNR_NR-$parts for file in *-$SNR_NR-$parts; do cat "$file" | sed -n '3p' \ | sed 's/$/
foo.sh
:
var1="$1"
var2="$2"
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> tmp
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> tmp
done
done
# Concatenate the above onto one line
paste -d " " - - < tmp
rm tmp
done
我已尝试将我的工作目录添加到$PATH
,但仍然无法工作。在foo.sh上运行ls-la会得到-rw------
,但是执行chmod+xfoo.sh
仍然不起作用
最奇怪的是,它试图创建一个名为tmp
的目录,我不太明白,因为它只是一个临时文件,用于存储一些中间结果,然后打印到shell中
编辑:
在采纳了评论中的建议后,以下内容反而产生了此错误,这是一种改进:
var1="$1"
var2="$2"
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> brian
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> brian
done
done
# Concatenate the above onto one line
paste -d " " - - < brian
rm brian
done
解决方案:
产生了一个简单的重写
var1="$1"
var2="$2"
# Supply results/script directory as argument
var3 = "$3"
# cd into script directory before running it
cd $var3
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> brian
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> brian
done
done
# Concatenate the above onto one line
paste -d " " - - < brian
rm brian
done
var1=“$1”
var2=“$2”
#提供结果/脚本目录作为参数
var3=“$3”
#在运行之前,请将cd放入脚本目录
cd$var3
对于SNR_NR,单位为$var1;做
对于$var2的零件;做
#回波*-$SNR\U NR-$parts
对于*-$SNR\u NR-$parts中的文件;做
cat“$file”| sed-n'3p'\
|sed的/$/,/'>>brian
cat“$file”| sed-n'4p'\
|tr'','\
|sed的/^.\(.*\)$/\1/'>>brian
完成
完成
#将以上内容连接到一行
粘贴-d“--
否,它试图创建一个文件tmp
,但tmp
已经是该位置的目录
这就是为什么>tmp
、
和rm-tmp
都失败,而是一个目录
错误,因为它们都不能在目录上操作
如果您想要一个安全的临时文件,请使用mktemp
否,它试图创建一个文件tmp
,但tmp
已经是该位置的目录
这就是为什么>tmp
、
和rm-tmp
都失败,而是一个目录
错误,因为它们都不能在目录上操作
如果您想要一个安全的临时文件,请使用mktemp
您已经有一个名为“tmp”的目录,因此无法创建具有此名称的文件。您可以通过在脚本开头执行以下操作来了解这种情况:
if [[ -d tmp ]]
then
echo I can not execute this script, because a directory named tmp exists
ls -ld tmp
exit 1
fi
当然,tmp
不是临时文件的最佳名称….您已经有一个名为“tmp”的目录,因此无法创建具有此名称的文件。您可以通过在脚本开头执行以下操作来了解这种情况:
if [[ -d tmp ]]
then
echo I can not execute this script, because a directory named tmp exists
ls -ld tmp
exit 1
fi
当然,tmp
无论如何都不是临时文件的最佳名称……我不太明白。在运行脚本之前,工作目录中没有名为tmp
的目录。但是,如果它像你说的那样,那么如果我从工作目录运行它,它怎么会工作呢?@Astrid:IMHO,它应该在任何不包含tmp
子文件夹的目录中工作,这意味着至少既没有“/”,也没有“/var”。这个错误非常清楚地表明工作目录已经有tmp
目录了。脚本的工作目录是运行它的shell/etc的工作目录,而不是脚本的目录(除非在脚本本身中更改)。将pwd
或echo$pwd
添加到脚本和ls
或ls-tmp
中,然后查看您是否得到了预期的结果。这将再次运行。glob正在查找工作目录,而不是脚本目录。请参阅以了解如何处理该问题。当shell展开时,它将展开当前目录中的glob并匹配当前目录中的文件。当前目录不是脚本所在的目录。当前目录是运行脚本的shell进程的目录。当您在不同的目录中时,glob无法找到您希望它找到的文件(并且停留在*-0-500
),因此您尝试cat
,但该目录也不存在,并且出现故障。这就是为什么echo*
在不同的目录中输出不同的内容,例如(您可能知道并且通常期望得到这些内容)。我不太明白。在运行脚本之前,工作目录中没有名为tmp
的目录。但是,如果它像你说的那样,那么如果我从工作目录运行它,它怎么会工作呢?@Astrid:IMHO,它应该在任何不包含tmp
子文件夹的目录中工作,这意味着至少既没有“/”,也没有“/var”。这个错误非常清楚地表明工作目录已经有tmp
目录了。脚本的工作目录是运行它的shell/etc的工作目录,而不是脚本的目录(除非在脚本本身中更改)。将pwd
或echo$pwd
添加到脚本和ls
或ls-tmp
中,然后查看您是否得到了预期的结果。这将再次运行。glob正在查找工作目录,而不是脚本目录。请参阅以了解如何处理该问题。当shell展开时,它将展开当前目录中的glob并匹配当前目录中的文件。当前目录不是脚本所在的目录。当前目录是运行脚本的shell进程的目录。当您在不同的目录中时,glob无法找到您希望它找到的文件(并且停留在*-0-500
),因此您尝试cat
,但该目录也不存在,并且出现故障。这就是为什么echo*
会在不同的目录中输出不同的内容,例如(您可能知道并且通常期望这些内容)。。。我明白了,这对我来说并不明显,谢谢。现在我得到了这个,在改变了临时工的名字之后
if [[ -d tmp ]]
then
echo I can not execute this script, because a directory named tmp exists
ls -ld tmp
exit 1
fi