2014-12-16 4 views
1

Мне нужно написать скрипт, который будет принимать два имени файла в качестве аргументов, а затем удалить все дубликаты слэшей из них и передать их в другое приложение, скажем, vim.Переменные сценария Bash

я начал что-то подобное, но, конечно, это не работает

#!/bin/bash 
/usr/local/bin/vim $($1 | sed s#//*#/#g) 
+0

Удалить дубликаты слэша из имен файлов или файлов? –

+0

... и почему вам небезразлично удалять повторяющиеся косые черты с имени? Имя файла, начинающееся с '//' _may_, должно быть обработано специальным образом, если локальная ОС или файловая система решает это сделать, но где угодно, кроме как в лидирующей позиции, дополнительные косые черты безвредны для любой POSIX-совместимой системы. –

+1

Кроме того, этот код создает ошибки при передаче имен файлов с пробелами. –

ответ

2

Оператор трубы будет принимать вывод одной команды и передать его в другую команду. В вашем случае $1 - это строковое значение, которое вы не хотите запускать в качестве команды. Вместо этого вы можете передать это значение в sed с оператором строки перенаправления <<< следующим образом:

$(sed s#//*#/#g <<< $1) 
+0

Является ли' <<< 'специфичным для Bash или является он также доступен в оболочке POSIX? – dreamlax

+0

@dreamlax, это багизм. –

+1

... эквивалент POSIX будет «<< EOF», за ним следует новая строка, затем «$ 1», затем еще одна новая строка, затем «EOF». Очевидно, что использование '<<<' короче. –

1

Дайте readlink попробовать:

/usr/local/bin/vim "$(readlink -m "$1")" 
+0

Требуется больше цитат: '' $ (readlink -m "$ 1") "' –

+0

@CharlesDuffy Спасибо –

+0

независимо от того, сколько котировок я положил - для меня это не работает – Agzam

Смежные вопросы