#!/bin/sh
( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )
То есть,
cd
в каталог, заданный вторым аргументом, или в .
, если второй аргумент не указан или он пуст. --
запрещает cd
интерпретировать что-либо в $2
как вариант. ls -d
для всех имен, начинающихся с первого аргумента. -d
предотвращает перечисление содержимого любых каталогов с соответствующими именами каталогов. --
запрещает ls
интерпретировать что-либо в $1
как вариант. Если задан второй аргумент, в конце шаблона будет /
и, следовательно, он будет соответствовать только именам каталогов. Все это происходит в подоболочке, так что cd
не меняет рабочий каталог остальной части скрипта (, на что, как я полагаю, намекает последнее предложение ). В любом случае сценарий не сможет изменить рабочий каталог для вызывающей оболочки, если только эта оболочка не использует source
для запуска сценария, а подоболочка не предотвратит этого. Таким образом, рабочий каталог восстанавливается ("возвращается" )к тому состоянию, в котором он был до запуска сценария.