Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 试图从不同位置运行shell脚本,但错误显示为I';我正试图创建一个目录_Linux_Bash_Shell - Fatal编程技术网

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