Как написать сценарий bash для компиляции нескольких файлов, содержащих пробелы?

(IFS=$'\n'; set -f; your_program $(ls -tr))

Предполагается, что имена файлов не содержат символов новой строки.

Пример:

% touch 'a   b'
% touch 'c d'
% touch '*'
% (IFS=$'\n'; set -f; printf '%s\n' $(ls -tr))
e    f
a   b
c d
*

Вариант для стандартной оболочки, которая не поддерживает $'...'строки:

(IFS='
' ; set -f; your_program $(ls -tr))

Простая оболочка Python, которая будет работать даже с именами файлов, содержащими символы новой строки. Использование может быть this_wrapper your_program *.

#! /usr/bin/python
import os
import sys

sys.argv[2:] = sorted(sys.argv[2:], key=os.path.getmtime)
os.execvp(sys.argv[1], sys.argv[1:])
1
03.10.2020, 19:28
2 ответа

Вам нужно заключать переменные в двойные кавычки, а не '"'литеральные строки в двойных кавычках, а просто "$f"двойные кавычки. См. Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX для получения подробной информации.

И я бы использовал больше переменных, чтобы уменьшить дублирование.

Попробуйте это:

#!/usr/bin/env bash
cppdir="$HOME/Desktop/cpp/$1"
if [[ ! -d "$cppdir" ]]; then
    echo "No such directory" >&2
    exit 1
fi

outdir="${cppdir}o"
mkdir -p "$outdir"

errlog="${cppdir}err.log"

for f in "$cppdir"/*; do
    b=$(basename "$f")
    printf '%s\n' "$b" >> "$errlog"
    g++ "$f" -std=c++11 -o "$outdir/$b.out" 2>> "$errlog"
done
2
18.03.2021, 23:00

Стандартным способом является использование findи xargsс символомNUL-в качестве разделителя:

outdir="$1"o
mkdir "$outdir"
errlog="$1"err.log
touch "$errlog"

find ~/Desktop/cpp/"$1"/ -type f -name '*.cpp' -print0 |
  xargs -0 -I source bash -c "echo source >> $errlog &&
    g++ source -std=c++11 -o source.out 2>> $errlog"
0
18.03.2021, 23:00

Теги

Похожие вопросы