Получить выходное имя файла в скрипте Bash

Я хотел бы получить только имя файла (с расширением) выходного файла, который я передаю моему скрипту bash:

a=$1
b=$(basename -- "$a")
echo $b #for debug
if [ "$b" == "test" ]; then
 echo $b
fi

Если я ввожу:

./test.sh /home/oscarchase/test.sh > /home/oscarchase/test.txt

Я хотел бы получить:

test.txt

в моем выходном файле, но я получаю:

test.sh

Как я могу обработать этот первый аргумент, чтобы получить правильное имя?

2 ответа

Поиск имени файла, который открывается в дескрипторе файла 1 (стандартный вывод), не является тем, что вы можете сделать непосредственно в bash; это зависит от того, какую операционную систему вы используете. Вы можете использовать lsof и awk для этого; он не полагается на файловую систему proc, и хотя точный вызов может отличаться, эта команда работала как для Linux, так и для Mac OS X, поэтому она по крайней мере переносима.

output=$( lsof -p $$ -a -d 1 -F n | awk '/^n/ {print substr($1, 2)}' )

Некоторое объяснение:

  • -p $$ выбирает открытые файлы для текущего процесса
  • -d 1 выбирает только дескриптор файла 1
  • -a используется, чтобы требовать применения -p и -d (по умолчанию -d все файлы, соответствующие либо условию
  • -F n изменяет выход так, что вы получаете одну строку в поле, с префиксом символа идентификатора. При этом вы получите две строки: один начинается с p и указывает идентификатор процесса, а один начинается с "n", указывающего имя файла.
  • Команда awk просто выбирает строку, начинающуюся с n и выводит первое поле минус начальное n.


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

#!/bin/bash

 output=$(readlink /proc/$$/fd/1)
 echo "output is performed to \"$output\""

но помните, что это решение зависит от системы (особенно для Linux). Я не уверен, что файловая система /proc имеет такую же структуру, как, например, FreeBSD, и, безусловно, этот скрипт не будет работать в bash для Windows.

Ahha, FreeBSD устарел procfs некоторое время назад и теперь имеет другое средство, называемое procstat. Вы можете получить представление о том, как извлечь нужную информацию из следующего снимка экрана. Я предполагаю, что требуется некоторое awk-ing :)

licensed under cc by-sa 3.0 with attribution.