Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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/4/unix/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/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
通过管道通信在bash中传递目录_Bash_Unix_Pipe - Fatal编程技术网

通过管道通信在bash中传递目录

通过管道通信在bash中传递目录,bash,unix,pipe,Bash,Unix,Pipe,这个问题是一个家庭作业,我知道解决这个问题会有更简单的方法,但事实就是这样 问题如下: -我有一个bash脚本,可以执行一些操作并创建一些文件。 -我必须通过管道(|)将此脚本(目录)的第一个参数传递给另一个脚本 当我尝试将此目录作为参数传递时,问题就出现了。在另一个脚本中,我收到的参数是null 这是完整的代码,按此顺序排列。 没有遗漏什么 第一个脚本至少接收11个参数: if [[ $# -lt 11 ]]; then echo "Not enough arguments." >

这个问题是一个家庭作业,我知道解决这个问题会有更简单的方法,但事实就是这样

问题如下:
-我有一个bash脚本,可以执行一些操作并创建一些文件。
-我必须通过管道(
|
)将此脚本(目录)的第一个参数传递给另一个脚本

当我尝试将此目录作为参数传递时,问题就出现了。在另一个脚本中,我收到的参数是
null

这是完整的代码,按此顺序排列。
没有遗漏什么

第一个脚本至少接收11个参数:

if [[ $# -lt 11 ]]; then
    echo "Not enough arguments." >&2;
    exit 1;
fi;
脚本将检查第一个参数是否为实际目录:

if [[ ! -d $1 ]]; then
    echo "Not a valid first argument." >&2;
    exit 1;
fi;
在这里,我将在这里保存我的第一个目录,这样我就可以
shift
,然后我将声明我需要的更多内容

Directory=$1;
shift;
N=$#
name_array=("$#")
Pos=0;
之后,脚本将使用所有其他参数创建具有这些名称的.txt文件,并在每个.txt文件中添加许多非空行(因此,argument2.txt有N-1行,argument3.txt有N-2行…argumentN.txt有1行)。之后,我必须将其权限更改为600

while [[ $# -gt 0 ]]; do
    if [[ -a "$Directory"/"$1".txt ]]; then
        rm "$Directory"/"$1".txt;
    fi
        touch "$Directory"/"$1".txt
        for((i=0;i<N;i++)); do
            echo "$N" >> "$Directory"/"$1".txt;
        done;
        chmod u=rw "$Directory"/"$1".txt;
        N=$(($N-1));
        name_array["$Pos"]="$Directory"/"$1".txt;
        Pos=$(($Pos + 1));
        shift;
done;
我也尝试过这个,结果和上面的一样

echo "$(cd "$(dirname "$Directory")" && pwd -P)/$(basename "$Directory")";
。。这样我就可以在Shell中使用管道命令

第二个脚本将接收目录,输入它并通过刚才创建的所有文件进行搜索

在Unix终端中,我使用以下命令:

./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12 | ./SecondScript.bash

提前谢谢你

谢谢你的诚实,当然我们不会给你做家庭作业,但是

大部分代码看起来都很好。还有一些较小的问题,您可以使用
shellcheck
轻松解决(如果未安装,请安装它或使用web版本),我不会将
位于每行末尾

因此,与其立即运行整个管道,不如将其分解以找出问题所在。如果你跑

./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12
如果输出符合预期(因此,使用
echo$目录
),并且创建了文件,那么第一个脚本就可以了。因此,在这种情况下,目录
1
将包含文件
2 3 4 5 6 7 8 9 10 11 12
,输出将是
1

然后,您将运行第二个脚本

 ./SecondScript.bash
作为输入,您将给出:

1
^D
(即Unix上的control-d)。然后第二个脚本应该做你想做的(或者不做)

通过这种方式,您可以单独调试脚本


(快速面对手掌问题:1真的是您想要的目录吗,还是您只是忘记了作为第一个参数的目录名?

谢谢您的诚实,当然我们不会做您的家庭作业,但是

大部分代码看起来都很好。还有一些较小的问题,您可以使用
shellcheck
轻松解决(如果未安装,请安装它或使用web版本),我不会将
位于每行末尾

因此,与其立即运行整个管道,不如将其分解以找出问题所在。如果你跑

./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12
如果输出符合预期(因此,使用
echo$目录
),并且创建了文件,那么第一个脚本就可以了。因此,在这种情况下,目录
1
将包含文件
2 3 4 5 6 7 8 9 10 11 12
,输出将是
1

然后,您将运行第二个脚本

 ./SecondScript.bash
作为输入,您将给出:

1
^D
(即Unix上的control-d)。然后第二个脚本应该做你想做的(或者不做)

通过这种方式,您可以单独调试脚本


(快速面对手掌问题:1真的是您想要的目录,还是您忘记了作为第一个参数的目录名?

使用管道意味着收件人应该读取标准输入,而不是处理命令行参数。但你想问什么还真不清楚。是的,你遗漏了问题中最重要的部分。剩下的部分可以简化为
FirstScript${Dir}x |/SecondScript
。现在还不清楚
echo“$(cd“$(dirname“$目录”)”和&pwd-P)/$(basename“$目录”)有什么优势。只要坚持使用
echo“$Directory”
(如果您的讲师以
FirstScript“Dir with Spaces”x
?;-)开头,您当前的代码会做什么。祝你好运。@Sheller我被要求提供通过管道连接执行下一个脚本的绝对路径,很抱歉不清楚。是的,我现在坚持使用
echo$SomeArgument |/SomeScript.bash
,看在神圣的份上。感谢您的帮助。使用管道意味着收件人应该读取标准输入,而不是处理命令行参数。但你想问什么还真不清楚。是的,你遗漏了问题中最重要的部分。剩下的部分可以简化为
FirstScript${Dir}x |/SecondScript
。现在还不清楚
echo“$(cd“$(dirname“$目录”)”和&pwd-P)/$(basename“$目录”)有什么优势。只要坚持使用
echo“$Directory”
(如果您的讲师以
FirstScript“Dir with Spaces”x
?;-)开头,您当前的代码会做什么。祝你好运。@Sheller我被要求提供通过管道连接执行下一个脚本的绝对路径,很抱歉不清楚。是的,我现在坚持使用
echo$SomeArgument |/SomeScript.bash
,看在神圣的份上。谢谢你的帮助。这只是一个简单的例子。我不会把我的目录命名为1。不管怎样,我都设法解决了我的问题。当涉及到管道时,我更多地记录了我自己,并且我意识到如何正确地使用它们。不管怎样,谢谢你的回复!还有一个简短的问题。当有人说他们希望在两个脚本之间建立管道连接时,在第一个sc的末尾建立管道连接是否被认为是错误的