릴리즈 노트에 언급된 코드보다 좀 더 간소화된 형태로 스크립트 파일의 특성을 살려본 코드를 공유합니다. 단 이 방법의 경우, CallerFilePathAttribute를 쓰기 때문에 파일 경로가 하드코딩되는 문제가 있어 독립적인 바이너리로 배포하는 경우에는 Environment.CurrentDirectory 등의 속성으로 대체해야 하는 한계가 있습니다.
#!/usr/bin/env dotnet
await Console.Out.WriteLineAsync($"Hello, World! from {GetFilePath()}, {GetDirectoryPath()}");
// 아래 스크립트는 File-based App으로 실행할 때에만 올바르게 작동합니다.
#pragma warning disable 8321
static string GetFilePath([System.Runtime.CompilerServices.CallerFilePath] string s = "") => s;
static string? GetDirectoryPath() => Path.GetDirectoryName(GetFilePath());
#pragma warning restore 8321
그리고 .cs 확장자를 안붙여도 일반 셸 스크립트처럼 쓸 수 있는건 큰 매력인 것 같습니다. ㅎㅎ 다만 일반 셸 스크립트랑 다르게 빌드 과정이 화면에 최초 한 번은 나타나고, 파일 이름이나 경로가 바뀔 때마다 다시 빌드가 일어나는 부분은 명확한 한계점인 것 같습니다. (File-based App 자체는 DLR 기반의 스크립트가 아니므로)