gpt4 book ai didi

linux - 从 bash 文件运行查找命令

转载 作者:太空狗 更新时间:2023-10-29 11:12:43 25 4
gpt4 key购买 nike

大家好:我正在制作一个 xfe 脚本,将给定目录作为源文件,使用 zenity 获取输出目录并执行一些操作,例如:

#!/bin/bash

OUTPUT_DIR=`zenity --file-selection --directory --filename="$1"`

if [ $? == 0 ]; then
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

调用脚本时,oggenc 不会执行...有什么想法吗?

解决方案:根据以下答案,这按预期工作:

#!/usr/bin/sh

OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")

if [ $? = 0 ]; then
export OUTPUT_DIR
find "$1" -maxdepth 1 -type f -name "*.wav" -exec sh -c 'oggenc -Q "$0" -q 3 -o "${OUTPUT_DIR}/$(basename "${0/.wav/.ogg}")"' {} \;
fi
zenity --info --text="Done"

最佳答案

要使变量 $OUTPUT_DIR 可用于子进程,添加一行:

OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")
if [ $? = 0 ]; then
export OUTPUT_DIR
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

或者,稍微简单一点:

if OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1"); then
export OUTPUT_DIR
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi

注意事项:

  1. 命令 'oggenc -Q "$0"-q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' 出现在单引号中。这意味着变量不会被父 shell 扩展。它们由子外壳扩展。要使其对子 shell 可用,必须导出一个变量。

  2. [ $? == 0 ] 在 bash 中工作但是 [ $? = 0 ] 也可以工作并且更便携。

  3. 命令替换可以用反引号完成,一些旧的 shell 只接受反引号。然而,对于现代 shell,$(...) 具有提高可读性的优势(某些字体不能清楚地区分反引号和普通引号)。此外,$(...) 可以以清晰合理的方式嵌套。

关于linux - 从 bash 文件运行查找命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com